这个问题在这里已经有了答案:
A use for multiple inheritance?
(12 个回答)
5年前关闭。
当使用多重继承而不是使用组合或其他替代方法可以更容易地解决问题时,您能否提供一些真实世界的示例?
什么时候应该使用多重继承?
为什么有些语言支持多重继承(C++、Python)而其他语言不支持(Java、Ruby)?我的意思是——基于编程语言的创建者决定是否支持 MI 的因素。
最佳答案
多重继承主要用于集成目的,即当您需要一个对象来实现它派生的类的所有必需功能时。这是否相当于一个比可能的替代方案“更好”的解决方案,是一个争论或品味的问题,所以你可能很幸运,这个问题并没有因为主要基于意见而被关闭。
关于例子,
显示了实现共享的示例。你不能有这个
接口(interface)或组合,
Button
来自 Rectangle
和 Clickable
(它也有一长串支持 MI 的语言),Observable
等等,至少 Bertrand Meyer 声称使用 MI 实现起来比不使用 MI 更干净(因此你也很幸运,这个问题没有因为重复而被关闭)。 从个人经验来看,多重继承可能很有帮助,但它也很容易成为一个大问题。 Wikipedia 页面在一定程度上讨论了 Diamond 问题:它归结为一个问题,如果两个或多个基类提供某个方法的实现会发生什么。语言需要定义/实现一种方法来处理这个问题,通常通过定义一些方法解析顺序(例如 Python's mro )。
当然,潜在的冲突会随着基类的数量和方法的数量而增加。我曾经有一个案例,我们使用的框架(用 Python 实现)对我们派生的某个类使用了少数基类的多重继承。然后我们可以愉快地重写一个继承的方法,而不用意识到它。
多重继承虽然有时很有用,但可以被视为违反 Single responsibility principle :根据定义,从多个基类派生的类将表现得像任何一个类。因此,从数据建模的角度来看,Liskov substitution principle 也很有可能。也被违反了。
因此,我相信编程语言的创建者可能会认识到多重继承并非没有概念问题,并且可能需要大量的实现工作,同时仅提供比其他解决方案有限的附加值——但这只是我个人的猜测。
关于inheritance - 多重继承什么时候派上用场?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478542/