java - Kotlin(或自 Java 8 以来)有抽象类和接口而不是多重继承的原因是什么?
问题描述
在 C++ 或 Python 上,支持多重继承,因此您可以扩展多个类或抽象类。因此,如果您想制作类似接口的东西,您只需制作一个完整的抽象类。
在 Java 或 Kotlin 等语言上,不支持多重继承,但它们具有接口,一个类可以多次实现以实现与此功能类似的功能。但是,在 Kotlin 或自 Java 8 以来,抽象类或接口之间没有太大区别,因为它们都可以有抽象方法和具体实现,所以我想知道什么时候使用每一个,主要是语言的原因是什么(特别是 Kotlin是更新的)以这种方式实现,而不是使用多重继承,如果你可以用后者实现同样的事情?
或者只是实现多重继承的另一种方式,或者抽象类和接口提供了多重继承所没有的东西,它会影响在哪些情况下使用一个而不是另一个(接口优于抽象类)?
解决方案
然而,在 Kotlin 或自 Java 8 以来,抽象类或接口之间没有太大区别,因为它们都可以有抽象方法和具体实现
有一个主要区别:抽象类可以具有状态(由具体实现继承),而接口则不能。
所以我想知道什么时候使用每个
当您需要定义要与具体实现共享的有状态行为时,您必须使用抽象类。否则,最好坚持使用接口,因为它的约束较少:一个类可以实现多个接口,并且可以通过委托等方式实现接口。
如果您可以使用后者实现相同的目标,那么以这种方式实现语言(尤其是更新的 Kotlin)而不是使用多重继承的原因是什么?
只是一个猜测,但 Kotlin 可能无法获得多重继承,即使它是可取的,因为 JVM 不支持它。但无论如何,我不认为这是设计师想要采取的方向,因为它需要可靠的用例,这真的很有帮助。在 Kotlin 中有很好的语法糖的简单委托,这有助于以更可控的方式覆盖这类用例。
推荐阅读
- java - 其他服务器套接字在向服务器套接字发送数据时接收数据
- c# - 如何从另一个类访问协程中定义的变量?
- python - 在 AWS Transcribe 中实时获取 BadRequestException
- excel - 在 VBA 的 Excel 工作表中计算所有单元格中文本出现次数的最佳和最快方法是什么?
- python - 如何增加箱形图x轴上的值之间的空间?
- cypress - 无法读取未定义的属性“indexOf”-Java 应用程序中的赛普拉斯测试
- javascript - 如何使用变量和字符串定位对象属性?
- scala - 具有替代方法的重载方法 foreachBatch
- python - 使用 VS Code 在本地调试 Azure Functions 时无法进行身份验证
- webrtc - WebRTC:如何为视频编码器启用硬件加速