为什么C#以这种方式设计,能够从无限制的类中派生出来的缺点是什么? (我知道你可以在大多数情况下使用接口)
答案 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将两者连接在一起形成菱形。
另外,来自c#dev团队:
MI真正合适的地方实际上非常小。在许多情况下,多个接口继承可以完成工作。在其他情况下,您可以使用封装和委派。如果我们要添加一个稍微不同的构造,比如mixins,那实际上会更强大吗?
多实现继承为实现注入了很多复杂性。这种复杂性会影响投射,布局,调度,现场访问,序列化,身份比较,可验证性,反射,泛型,以及可能还有很多其他地方。
答案 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?
}
}