Scala vs. Kotlin:多重继承与Diamond


C ++以允许多重继承和描述diamond problem而闻名 。它指出,当子类从具有相同方法的多个类继承时,会出现问题。

C ++有其自身的解决钻石问题的方法。为了避免这种情况,Java完全禁止多重继承。让我们检查一下Scala和Kotlin的fare。

Scala

Scala不允许多重继承 本身,而是使我们能够扩展多种性状。

特性用于在类之间共享接口和字段。它们类似于Java8的接口。类和对象可以扩展特征,但是特征不能被实例化,因此没有参数。 — Scala文档

上图转换为以下代码:

trait Openable {
  def open() { ... }
}

trait Window extends Openable {
  def open() { ... }
}

trait Door extends Openable {
  def open() { ... }
}

class WindowDoor extends Door with Window {
  ...
}

Scala通过在所有超级特征中定义一个主要的超级特征来解决Diamond问题 。主要的一个设置为 extends 关键字,而其他的设置为 with。

因此,在上面的示例中, WindowDoor.open() 默认情况下将使用中的代码 Door.open()。当然,没有什么可以阻止我们重写该方法。

Kotlin

与Scala一样,Kotlin不允许我们扩展多个超类。但是,接口可以具有具体功能。

Kotlin中的接口与Java 8非常相似。它们可以包含抽象方法的声明以及方法的实现。它们与抽象类的不同之处在于接口无法存储状态。 — Kotlin文档

以下是上面在Kotlin中翻译的代码:

interface Openable {
    fun open() { ... }
}

interface Window : Openable {
    override fun open() { ... }
}

interface Door : Openable {
    override fun open() { ... }
}

class WindowDoor : Door, Window {
    override fun open() { ... }
}

Kotlin采取了另一条解决钻石问题的途径:显式覆盖。如果一个函数由多个父类实现,则编译器会检测到Diamond的出现,并引发错误。要解决此问题,开发人员必须明确编码所需的行为。

结论 尽管Scala的方法更优雅,但Kotlin的方法却与它的哲学相一致:在简洁之前要明确且易读。


原文链接:http://codingdict.com