迪杰斯卡拉算法_斯卡拉vsKotlin:多重继承与钻石问题

迪杰斯卡拉算法

这是4斯卡拉与Kotlin重点series.Other帖子后包括:

  1. 斯卡拉vsKotlin:皮条客我的图书馆
  2. Scala vs Kotlin:运算符重载
  3. Scala vs Kotlin:内联和中缀
  4. Scala vs Kotlin:多重继承与钻石问题 (本文)

继承与封装和多态性一起,是面向对象编程的基本宗旨之一。 除了简单继承外 ,还有多个继承

多重继承是某些面向对象的计算机编程语言的一种功能,其中一个对象或类可以从多个父对象或父类中继承特征和功能。 它不同于单一继承,在单一继承中,一个对象或类只能从一个特定的对象或类继承。
—维基百科
https://zh.wikipedia.org/wiki/多重继承

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

钻石问题

C ++有其应对钻石问题的方式。 为了避免这种情况,Java完全禁止多重继承。 让我们检查一下Scala和Kotlin的票价。

斯卡拉

斯卡拉不允许多重继承本身 ,而是允许扩展多个性状。

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

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

interfaceOpenable{
    funopen(){...}
}

interfaceWindow:Openable{
    overridefunopen(){...}
}

interfaceDoor:Openable{
    overridefunopen(){...}
}

classWindowDoor:Door,Window{
    overridefunopen(){...}
}

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

结论

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

翻译自: https://blog.frankel.ch/scala-vs-kotlin/4/

迪杰斯卡拉算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值