3

可能重复:
为什么Java中没有多重继承,但允许实现多个接口

到目前为止,我所看到的关于“为什么 Java 没有多重继承”的每个答案都只有一个更具体或更详细的答案,即“降低复杂性”,但没有人定义它如何降低复杂性,如果我们使用接口而不是类什么它产生的差异。难道不是一回事吗?如果我们实现一个接口而不扩展我们的类有什么区别?有人回答钻石问题,但接口也可以产生钻石问题。

4

2 回答 2

6

接口与类之间的多重继承之间的区别在于何时必须继承实现。通过多条路径继承方法接口时,可以说实现类必须实现继承的方法。当您从多个类继承时,您必须决定选择几个实现中的哪一个。这极大地增加了语言的复杂性,正如您通过检查 C++ 中实现多重继承的方式所看到的那样。

这是一个插图:

public class Base {
    public void foo() {System.out.println("base");}
}
public class A extends Base {
    public void foo() {System.out.println("a");}
}
public class B extends Base {
    public void foo() {System.out.println("b");}
}
public class AB extends A, B /* imagine that it's a possibility */{
}

当你这样做时会发生什么?

AB ab = new AB();
ab.foo();

有了接口的继承,AB就必须实现foo;通过实现的继承,语言将需要决定或为您提供一种自己指定它的方法。无论哪种方式,复杂性都会增加。

于 2012-07-31T02:34:00.123 回答
2

接口不附带代码:只有一组必须实现的方法。

类带有代码。当你遇到类的菱形问题时,你最终会得到同一个函数的两个实现,它们可能引用相同的变量。

对于接口,只有一种实现,尽管接口可以来自很多地方。

于 2012-07-31T02:32:30.690 回答