代码之家  ›  专栏  ›  技术社区  ›  johnc

多重继承批评

  •  2
  • johnc  · 技术社区  · 16 年前

    reference 在维基百科上。

    对MI列表的一个批评是“不能从单个类显式继承多次”。我对这句话感到困惑,也不是100%确定这是指什么。

    我想了解这一批评所指的是什么,以及为什么它对支持多继承的语言隐式不可用。

    6 回复  |  直到 16 年前
        1
  •  6
  •   Aaron Digulla    16 年前

    这就是所谓的 Diamond Problem . 大多数允许MI的现代语言都有一个解决方案。

    简而言之,您有这样一个类树:

    class A { public int f = 0; };
    
    class B extends A { f = 1; };
    
    class C extends A { f = 2; };
    
    class D extends B, C {};
    

        2
  •  1
  •   jpalecek    16 年前

    我想他们的意思是一辆普通车不能从它的四个轮子继承(例如继承四倍于普通轮子)。[在同一维基百科页面上看到C++节

    然而,我认为这种“省略”实际上是一个积极的特征,因为继承是用来表达子类型的,而不存在“单一类型的多个子类型”。这种“显式多重继承”并不比简单的组合好多少。

        3
  •  1
  •   ng5000    16 年前

    然而,在 the best OO book ever -可能;)-Betrand Meyer为多重继承做了很好的辩护。他也做了类似的辩护 here

        4
  •  1
  •   joel.neely    16 年前

    我认为问题在于维基百科的那篇文章。它包含不止一个尴尬或模糊的陈述,如以下珠宝:

    但是,这六种语言允许类从多个接口继承,从而在避免其他问题的同时重新创建所提到的一些问题。

    坦率地说,我不知道你问题中的这句话的作者意图是什么。这只是一篇写得不好的文章中含糊不清的另一个例子,IMHO。

        5
  •  1
  •   RS Conley    16 年前

    OOP的主要目标之一是行为的重用。这原来是一种幻想。在某些情况下很有用,但在其他情况下,我们真正感兴趣的是定义对象如何交互。看看设计模式中有多少模式使用接口而不是继承。

    实现接口,然后进行显式聚合,是执行多重继承所做相同操作的更清晰、更易于维护的方法。几乎所有的OOP都有定义接口的方法,几乎所有的OOP都可以将对象聚合在一起。然而,OOP以微妙的不同方式处理多重继承(菱形问题等)引起的问题。就像GOTO一样,当您使用多个iheritance查看代码时,不清楚发生了什么。然而,就像GOTO一样,它在不同的情况下也很有用。

    对我来说,使用任何困难的语言结构的首要考虑因素是我是否必须长期维护应用程序。如果我这样做了,那么我会选择最清晰、更容易维护的方法,即使现在需要更多的编程。和其他事情一样,这是一个判断的决定。请注意,大多数时候,我们都会坚持我们开发的程序,时间比我们想象的要长得多。

        6
  •  0
  •   anon anon    16 年前

    实际上,在C++类中 可以 从同一类继承多次:

    A类{};

    B类:公共A();

    C类:公共A();

    clsss D:公共B,公共C{};

    现在D以两个副本A结尾。这通常被认为是“坏主意”,C++提供虚拟继承来控制它。