首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要澄清钻石问题的实现部分

需要澄清钻石问题的实现部分
EN

Stack Overflow用户
提问于 2020-02-16 15:32:27
回答 2查看 43关注 0票数 0

为什么多重继承是不可能的?

如果A中有一个方法被B和C重写,而D没有重写它,那么D将继承该方法的哪个版本:B的版本还是C的版本?

好吧。很好

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

这个答案让我很困惑。我看过很多文章讨论为什么类不可能有多个继承,而且他们从来没有讨论过实现。当我们问关于接口的相同问题时,它们不符合相同的逻辑,现在他们说代码没有实现。为什么我们不用同样的逻辑呢?它的实现才是真正的问题所在?请只处理这一部分。

EN

回答 2

Stack Overflow用户

发布于 2020-02-16 15:55:08

接口是一个约定,它指定了类需要实现什么方法,所以当您调用这个方法时,只有一个实现,这与多重继承不同,在多重继承中,编译器不知道要采用什么方法。

在多重继承中

代码语言:javascript
复制
class A
{
    public void DoSomething() {}
}

class B
{
    public void DoSomething() {}
}

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

在多个界面中

代码语言:javascript
复制
interface A
{
    void DoSomething();
}

interface B
{
    void DoSomething();
}

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

DoSomething()是在类C中实现的,因此实现了两个接口的约定。

票数 1
EN

Stack Overflow用户

发布于 2020-02-16 16:41:38

如果B和C都为继承的方法提供了冲突的定义,而D重写了它们,那么菱形问题就会出现。如果B和C继承方法而不重写它们,而D为该方法提供重写,那么问题就不会出现,因为D的重写将同样影响B和C。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60246355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档