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

标签 inheritance architecture multiple-inheritance

这个问题在这里已经有了答案:





A use for multiple inheritance?

(12 个回答)


5年前关闭。




当使用多重继承而不是使用组合或其他替代方法可以更容易地解决问题时,您能否提供一些真实世界的示例?

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

为什么有些语言支持多重继承(C++、Python)而其他语言不支持(Java、Ruby)?我的意思是——基于编程语言的创建者决定是否支持 MI 的因素。

最佳答案

多重继承主要用于集成目的,即当您需要一个对象来实现它派生的类的所有必需功能时。这是否相当于一个比可能的替代方案“更好”的解决方案,是一个争论或品味的问题,所以你可能很幸运,这个问题并没有因为主要基于意见而被关闭。

关于例子,

  • 这篇关于 using Python's super() for multiple inheritance 的文章
    显示了实现共享的示例。你不能有这个
    接口(interface)或组合,
  • Wikipedia page on multiple inheritance 上解释了一个类似的例子。用于导出 Button来自 RectangleClickable (它也有一长串支持 MI 的语言),
  • 上一个问题的答案 for good MI examples指向 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/

    相关文章:

    python - 如何防止 Sphinx 将 "object"列为基类?

    c# - 声明式编程和命令式编程有什么区别?

    java - 关于为什么 'Anemic Domain Model' 被视为反模式的具体示例

    c++ - 如何最好地将私有(private)继承公开给基类?

    Java类继承

    c++ 继承 Building 方法

    c# - 接口(interface)会在子类中自动实现吗?

    rest - 构建 REST API 时如何管理业务逻辑

    c++ - 使用带有多重继承的enable_shared_from_this

    c++ - 为什么 GCC 不能消除多个继承函数的歧义(但 clang 可以)?