迪杰斯卡拉算法
这是4斯卡拉与Kotlin重点series.Other帖子后第包括:
- 斯卡拉vsKotlin:皮条客我的图书馆
- Scala vs Kotlin:运算符重载
- Scala vs Kotlin:内联和中缀
- Scala vs Kotlin:多重继承与钻石问题 (本文)
继承与封装和多态性一起,是面向对象编程的基本宗旨之一。 除了简单继承外 ,还有多个继承 :
多重继承是某些面向对象的计算机编程语言的一种功能,其中一个对象或类可以从多个父对象或父类中继承特征和功能。 它不同于单一继承,在单一继承中,一个对象或类只能从一个特定的对象或类继承。
—维基百科
https://zh.wikipedia.org/wiki/多重继承
https://zh.wikipedia.org/wiki/多重继承
C ++以允许多重继承和描述菱形问题而闻名。 它指出当子类从具有相同方法的多个类继承时会出现问题。
C ++有其应对钻石问题的方式。 为了避免这种情况,Java完全禁止多重继承。 让我们检查一下Scala和Kotlin的票价。
斯卡拉
斯卡拉不允许多重继承本身 ,而是允许扩展多个性状。
特性用于在类之间共享接口和字段。 它们类似于Java 8的接口。 类和对象可以扩展特征,但是特征不能被实例化,因此没有参数。
— Scala文档
http://docs.scala-lang.org/tutorials/tour/traits.html
http://docs.scala-lang.org/tutorials/tour/traits.html
上图转换为以下代码:
traitOpenable{
defopen(){...}
}
traitWindowextendsOpenable{
defopen(){...}
}
traitDoorextendsOpenable{
defopen(){...}
}
classWindowDoorextendsDoorwithWindow{
...
}
Scala通过定义一个主要的超级特征来解决钻石问题-在所有超级特征中将使用其代码。 主要的一个是用extends
关键字设置的,而另一个是用with
。
因此,在上面的示例中,默认情况下WindowDoor.open()
将使用Door.open()
代码。 当然,没有什么可以阻止我们重写该方法。
Kotlin
与Scala一样,Kotlin不允许扩展多个超类。 但是,接口可以具有具体功能。
Kotlin中的接口与Java 8非常相似。它们可以包含抽象方法的声明以及方法的实现。 它们与抽象类的不同之处在于接口无法存储状态。
— Kotlin文档
https://kotlinlang.org/docs/reference/interfaces.html
https://kotlinlang.org/docs/reference/interfaces.html
以下是上面在Kotlin中翻译的代码:
interfaceOpenable{
funopen(){...}
}
interfaceWindow:Openable{
overridefunopen(){...}
}
interfaceDoor:Openable{
overridefunopen(){...}
}
classWindowDoor:Door,Window{
overridefunopen(){...}
}
Kotlin采取了另一条解决钻石问题的途径:显式覆盖。 如果一个函数由多个父类实现,则编译器将检测钻石的出现,并引发错误。 要解决此问题,开发人员必须明确编码所需的行为。
结论
尽管Scala的方法更为优雅,但Kotlin的方法却与它的哲学相一致:在简洁之前要明确且易读。
迪杰斯卡拉算法