多重继承:什么是好例子?

时间:2012-02-20 10:53:41

标签: oop language-agnostic multiple-inheritance

我正在尝试找到一个使用多重继承的好例子,这是普通接口无法做到的。

我认为很难找到一个无法用另一种方式建模的例子。

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

2 个答案:

答案 0 :(得分:9)

以下是经典之作:

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 :(得分:2)

多个类继承有意义的一个例子是Observer模式。此模式描述了两个actor,观察者和observable,前者希望在后者更改其对象状态时得到通知。

通知客户端的简化版本在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,请考虑一下:如何你经常实现INotifyPropertyChanged接口吗?)。在我看来,具有多类继承的解决方案会更加清晰。在C ++中,上面的例子编译得很好。

Uncle Bob wrote an interesting article about this,这就是我从中得到的例子。但是这个问题通常适用于所有能够进行的接口(例如,可比较,等同,可枚举等):在这些情况下,多类继承版本通常更清晰,正如Bertrand Meyer在他的书“面向对象的软件构建”中所述。 ”