多重继承什么时候派上用场?

Luk*_*uke 18 architecture inheritance multiple-inheritance

当使用多重继承而不是使用组合或其他替代方案更容易解决问题时,您能提供一些真实示例吗?

什么时候应该使用多重继承?

为什么有些语言支持多重继承(C++,Python)而有些语言不支持(Java,Ruby)?我的意思是 - 基于什么因素,编程语言的创建者决定是否包括对MI的支持.

sch*_*eho 12

多重继承主要用于集成目的,即当您需要一个实现其派生类所需的所有功能的对象时.这是否相当于一个"更好"的解决方案而不是可能的替代方案,这是一个争论或品味的问题,所以你可能很幸运,这个问题并未以主要基于意见的方式结束.

关于例子,

从个人经验来看,多重继承可能非常有用,但它也很容易成为一个大问题.维基百科页面在某种程度上讨论了Diamond问题:它归结为如果两个或多个基类提供某种方法的实现会发生什么的问题.语言需要定义/实现一种处理方法,通常是通过定义一些方法解析顺序(例如Python的mro).

当然,冲突的可能性随着基类的数量和方法的数量而增加.我曾经遇到过一个案例,我们使用的框架(在Python中实现)使用了一些基类的多重继承来为我们派生的一些类.然后,我们可以愉快地覆盖继承的方法,而不会意识到它.

多重继承虽然有时很有用,但可以看作违反单一责任原则:根据定义,从多个基类派生的类将表现为任一类.因此,从数据建模的角度来看,也很可能违反Liskov替代原则.

因此,我相信编程语言的创建者可能会认识到多重继承被认为不是没有概念问题,可能需要大量的实施工作,同时只提供有限的附加值而不是其他解决方案 - 但这只是我个人的猜测.


Mat*_*tin 8

首先回答你的上一个问题:某些语言不支持多重继承的原因是因为它很少是必需的,并且与组合或多接口继承相比,往往会使代码变得更加复杂.

这与你的前两个问题有关,因为很难找到MI可以轻松解决问题的真实世界的例子(至少是一个简单的例子).显然,不支持MI的语言的创建者认为你永远不应该使用它.我猜想,一些语言的原因支撑是因为创作者认为,没有理由不这样做.

以下是MSDN上常见问题的链接,解释了为什么C#不支持多重继承.