需要澄清钻石问题的执行部分



为什么无法进行多次继承的答案?

如果 A 中存在 B 和 C 重写的方法,并且 D 没有重写它,那么 D 继承了该方法的哪个版本:B 的版本还是 C 的方法?

好。好

为什么它不适用于接口? 因为它没有实现。

这个答案让我感到困惑。我看过很多文章,讨论为什么不能用类进行多重继承,他们从不谈论实现。当我们问关于接口的相同问题时,他们没有采用相同的逻辑,现在他们说代码没有实现。我们为什么不遵循同样的逻辑呢?它的实现是这里真正的问题吗?请仅解决此部分。

接口是一个协定,用于指定类需要实现的方法,因此当您调用此方法时,只有一个实现,这与编译器不知道采用哪种方法的多重继承不同。

在多重继承中

class A
{
public void DoSomething() {}
}
class B
{
public void DoSomething() {}
}
class C : A, B
{
public override void DoSomething() {} // which DoSomething() is it?
}

在多个接口中

interface A
{
void DoSomething();
}
interface B
{
void DoSomething();
}
class C : A, B {
public void DoSomething() { }
}

DoSomething()是在类C中实现的,所以两个接口的契约都得到了满足。

如果 B 和 C被 D 覆盖,则会出现菱形问题,这两个 B 和 C 各自为继承的方法提供了相互冲突的定义。 如果 B 和 C 继承方法而不重写它们,并且 D 为该方法提供了覆盖,则不会出现此问题,因为 D 的覆盖会对 B 和 C 产生相同的影响。

如果 A、B 和 C 是接口,则 B 和 C 都无法为 A 的方法提供定义。 实现两个接口的类可以这样做,但它为 A 的方法提供的任何定义将同样适用于 B 和 C 的方法。

接口和类之间的另一个重要区别是,在重写类成员时,可以链接到父方法,但在实现接口时,永远不会有要链接到的父方法。

最新更新