【问题标题】:What are the reasons there are abstract classes and interfaces in Kotlin (or since Java 8) instead of multiple inheritance? [duplicate]Kotlin(或自 Java 8 以来)有抽象类和接口而不是多重继承的原因是什么? [复制]
【发布时间】:2021-08-11 19:25:52
【问题描述】:

在 C++ 或 Python 上,支持多重继承,因此您可以扩展多个类或抽象类。因此,如果您想制作类似接口的东西,您只需制作一个完整的抽象类即可。

在 Java 或 Kotlin 等语言中,不支持多重继承,但它们具有一个类可以多次实现的接口,以实现与此功能类似的功能。但是,在 Kotlin 或自 Java 8 以来,抽象类或接口之间没有太大区别,因为它们都可以有抽象方法和具体实现,所以我想知道什么时候使用每一个,主要是语言的原因是什么(特别是 Kotlin是更新的)以这种方式实现,而不是使用多重继承,如果你可以用后者实现同样的事情?

或者只是实现多重继承的另一种方式,或者抽象类和接口提供了多重继承所没有的东西,并且它会影响您在哪些情况下使用一个而不是另一个(接口优于抽象类)?

【问题讨论】:

标签: java kotlin interface abstract-class


【解决方案1】:

然而,在 Kotlin 或 Java 8 之后,抽象类或接口之间没有太大区别,因为它们都可以有抽象方法和具体实现

有一个主要区别:抽象类可以有状态(由具体实现继承),而接口不能。

所以我想知道什么时候使用每个

当您需要定义要与具体实现共享的有状态行为时,您必须使用抽象类。否则,最好坚持使用接口,因为它的约束较少:一个类可以实现多个接口,并且可以通过委托等方式实现接口。

如果您可以使用后一种实现相同的目标,那么以这种方式实现语言(尤其是更新的 Kotlin)而不是使用多重继承的原因是什么?

只是一个猜测,但 Kotlin 可能无法获得多重继承,即使它是可取的,因为 JVM 不支持它。但无论如何,我不认为这是设计师想要采取的方向,因为它需要可靠的用例,这真的很有帮助。在 Kotlin 中有简单的 delegation 和漂亮的语法糖,它有助于以更可控的方式覆盖这类用例。

【讨论】:

  • 关于你在最后一段中的猜测:Python 有多重继承。这并没有阻止 python 在 JVM 上实现。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2011-06-21
  • 2019-04-30
  • 2017-11-27
  • 2020-05-20
  • 2018-08-10
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多