【问题标题】:Java: Why multiple interfaces instead of multiple inheritance? [duplicate]Java:为什么使用多个接口而不是多重继承? [复制]
【发布时间】:2011-06-21 07:28:11
【问题描述】:

可能的重复:
Why does Java allow multiple inheritance from interfaces but not from abstract/concrete classes
Why there is no multiple inheritance in Java, but implementing multiple interfaces is allowed

为什么我们被告知要实现多个接口,而不是从多个类继承(Java 不允许)?

当然,从多个类继承的重点是继承它们的功能 - 如果您必须手动重新插入功能(对于扩展一组接口的每个类),使用这些接口有什么意义?不能保证实现同一组接口的两个类将提供相同的功能 - 还是我遗漏了什么?

【问题讨论】:

  • @org,请注意,您找到的那个本身就是重复的 - 我在原始链接中链接了 :-)
  • 这里保证实现相同接口集的两个类将提供相同的功能:这就是接口的用途。
  • @Péter @Any Moderator 它应该自动将具体副本放在这里
  • 我的问题不是我为什么不能扩展多个类。它是“使用多个接口有什么意义?”。
  • @Mikaveli:如果实现有问题,你为什么要使用它?如果您想保证从一个公共基础派生的两个类(无论是类还是接口)具有相同的实现,那么多态性(无论是接口还是类)都是错误的工具。即使使用多类继承,您也不能保证基类不会覆盖这些实现。

标签: java abstract-class multiple-inheritance


【解决方案1】:

多重继承会导致多个问题。

接口用于为实现它们的类的实例提供能力。我个人使用带有组合的接口(使用引用其他对象的实例变量),以便为我的类提供原本可以通过多重继承实现的功能。

换句话说,我的类提供了实现的接口所承诺的功能,但在内部我的类实例使用实例变量来完成这项工作。

“不能保证两个类 实现同一套 接口将提供相同的 功能 - 或者我错过了 什么?”

关于你上面的陈述:

每个方法都应该遵守约定,因此无论您如何实现它,如果这是应该做的,方法的功能应该始终相同。如果它违反了合同,则意味着它被错误地执行了。

【讨论】:

    【解决方案2】:

    多重继承可能导致循环继承..避免我们使用基于接口的继承..

    【讨论】:

    • 请解释一下您所说的“多重继承可能导致循环继承”是什么意思?单继承也可以:class Foo extends Bar {} class Bar extends Foo {}
    • 编辑“循环继承”->“钻石问题”。确实使用了错误的术语。给您带来不便很抱歉..!!!感谢您发现它,为您的评论 +1!
    • 钻石如何成为“问题”?
    【解决方案3】:

    您应该阅读有关菱形依赖问题http://en.wikipedia.org/wiki/Diamond_problem 并避免这种 Java 选择接口而不是多个类的扩展

    【讨论】:

    • 不存在“钻石问题”。 (你也可以拥有一个带有接口的“钻石”。)
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 2014-03-04
    • 2020-05-20
    • 2011-04-15
    • 2011-03-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多