为什么我不能从多个类继承?

时间:2017-08-30 00:54:59

标签: c# .net

为什么C#以这种方式设计,能够从无限制的类中派生出来的缺点是什么? (我知道你可以在大多数情况下使用接口)

2 个答案:

答案 0 :(得分:3)

多重继承会导致Diamond Problem

  

“钻石问题”(有时被称为“致命的死亡钻石”)是一种歧义,当两个B和C类继承自A,而D类继承自B和C时会出现歧义。如果有A中B和C重写的方法,D不覆盖它,那么D继承的方法版本是哪个:B的那个,还是C的那个?

     

例如,在GUI软件开发的上下文中,Button类可以从Rectangle(用于外观)和Clickable(用于功能/输入处理)类继承,而Rectangle和Clickable类都继承自Object类。现在如果为Button对象调用equals方法并且Button类中没有这样的方法但是在Rectangle或者Clickable(或两者)中有一个重写的equals方法,那么最终应该调用哪个方法?

     

由于这种情况下类继承图的形状,它被称为“钻石问题”。在这种情况下,A类位于顶部,B和C分别位于其下方,D将两者连接在一起形成菱形。

Diamong diagram

另外,来自c#dev团队:

  

MI真正合适的地方实际上非常小。在许多情况下,多个接口继承可以完成工作。在其他情况下,您可以使用封装和委派。如果我们要添加一个稍微不同的构造,比如mixins,那实际上会更强大吗?

     

多实现继承为实现注入了很多复杂性。这种复杂性会影响投射,布局,调度,现场访问,序列化,身份比较,可验证性,反射,泛型,以及可能还有很多其他地方。

Link

答案 1 :(得分:0)

高度自以为是的答案......因为事情可以变得时髦。

public class Goose
{
     public Wings MyWings {get;set;}
     public void Eat()
     {
         //.. eat before flying
     }
     public void Fly()
     {
         //.. flap wings
     }
}

public class Airplane
{
     public Engine MyEngine {get;set;}
     public void FuelUp ()
     {
         //.. fuel up before flying
     }
     public void Fly()
     {
         //.. start engine and accelerate
     }
}

public class SpruceGoose: Goose, Airplane
{


    public void SomeMethod()
    {
        this.Fly();   // do I flap my wings? 
                      // or do I start my engine and accelerate 
                      // or do I do both? which one first
                      // do I eat? or do I fuel up?
    }
}