Luk*_*uke 18 architecture inheritance multiple-inheritance
当使用多重继承而不是使用组合或其他替代方案更容易解决问题时,您能提供一些真实示例吗?
什么时候应该使用多重继承?
为什么有些语言支持多重继承(C++,Python)而有些语言不支持(Java,Ruby)?我的意思是 - 基于什么因素,编程语言的创建者决定是否包括对MI的支持.
sch*_*eho 12
多重继承主要用于集成目的,即当您需要一个实现其派生类所需的所有功能的对象时.这是否相当于一个"更好"的解决方案而不是可能的替代方案,这是一个争论或品味的问题,所以你可能很幸运,这个问题并未以主要基于意见的方式结束.
关于例子,
Button从Rectangle和Clickable(它也有支持MI语言一长串)Observable等等,至少Bertrand Meyer声称使用MI而不是没有实现更清洁(因此您也很幸运,这个问题没有作为重复被关闭).从个人经验来看,多重继承可能非常有用,但它也很容易成为一个大问题.维基百科页面在某种程度上讨论了Diamond问题:它归结为如果两个或多个基类提供某种方法的实现会发生什么的问题.语言需要定义/实现一种处理方法,通常是通过定义一些方法解析顺序(例如Python的mro).
当然,冲突的可能性随着基类的数量和方法的数量而增加.我曾经遇到过一个案例,我们使用的框架(在Python中实现)使用了一些基类的多重继承来为我们派生的一些类.然后,我们可以愉快地覆盖继承的方法,而不会意识到它.
多重继承虽然有时很有用,但可以看作违反单一责任原则:根据定义,从多个基类派生的类将表现为任一类.因此,从数据建模的角度来看,也很可能违反Liskov替代原则.
因此,我相信编程语言的创建者可能会认识到多重继承被认为不是没有概念问题,可能需要大量的实施工作,同时只提供有限的附加值而不是其他解决方案 - 但这只是我个人的猜测.