2012-02-20 54 views
10

我试图找到一个很好的例子来说明使用多继承是什么不能用普通接口完成的。多重继承:什么是一个好例子?

我觉得很难找到这样一个不能用另一种方式建模的例子。

编辑:我的意思是,有人可以给我一个很好的现实世界的例子,当你需要使用多重继承来实现这个例子尽可能干净。它不应该使用多个接口,就像你可以继承C++中的多个类一样。

+1

您接受 [Luchian Grigore的回答](http://stackoverflow.com/a/9360014/2932052),但你真的很满意吗?我认为这是一个非常好的问题(+1),但也许不适用于SO,因为它可能没有真正的答案可能说服关键程序员。 – Wolf 2015-02-02 10:24:31

+1

我不是很满意。我不得不在当天与一位关键程序员争论,他不喜欢这个论点。我只是坦白地说:D – 2015-02-03 10:55:19

+0

然后,最好不要接受“答案”,这只不过是一个(可怜的)维基百科例子的稀疏装饰引用。也许以后会有人有真正的答案 - 不,很可能不是我:-) – Wolf 2015-02-03 12:28:30

回答

7

下面是一个典型的:

class Animal { 
public: 
    virtual void eat(); 
}; 

class Mammal : public Animal { 
public: 
    virtual void breathe(); 
}; 

class WingedAnimal : public Animal { 
public: 
    virtual void flap(); 
}; 

// A bat is a winged mammal 
class Bat : public Mammal, public WingedAnimal { 
}; 

来源:wiki

+1

这是用接口完成的,我不想使用FULL类继承,因为它可能在C++中。 – 2012-02-20 11:00:23

+0

@PhilippSpieß是哪个界面? – 2012-02-20 11:01:03

+0

@PhilippSpieß还有什么是全班继承? – 2012-02-20 11:01:21

2

其中多个类继承有意义的一个示例是Observer模式。这个模式描述了两个角色,观察者和观察者,前者希望在后者改变其对象状态时得到通知。

的简化版本,用于通知客户端可以像在C#:

public abstract class Observable 
{ 
    private readonly List<IObserver> _observers = new List<IObserver>(); 

    // Objects that want to be notified when something changes in 
    // the observable can call this method 
    public void Subscribe(IObserver observer) 
    { 
     _observers.Add(observer); 
    } 

    // Subclasses can call this method when something changes 
    // to notify all observers 
    protected void Notify() 
    { 
     foreach (var observer in _observers) 
      observer.Notify(); 
    } 
} 

这基本上是你需要的所有注册的观察者通知的核心逻辑。你可以通过从这个类派生任何可观察类,但是因为C#只支持单类继承,所以你不能从另一个类派生。像这样的东西是行不通的:

public class ImportantBaseClass { /* Members */ } 

public class MyObservableSubclass : ImportantBaseClass, Observable { /* Members */ } 

在这种情况下,你往往要复制,使子观察到在所有这些代码,基本上违反不要重复自己和真理原则的单点(如果你在C#中使用了MVVM,那么考虑一下:你多久执行一次接口?)。我认为一个多类继承的解决方案会更清晰。在C++中,上面的例子会编译得很好。

Uncle Bob wrote an interesting article about this,这就是我从中得到的例子。但是,这个问题通常适用于所有可以接口的接口(例如可比较的,可比较的,可枚举等):在这些情况下,多类继承版本通常比较干净,正如Bertrand Meyer在其着作“面向对象的软件构造”。