【问题标题】:Multiple Inheritance: What's a good example?多重继承:有什么好的例子?
【发布时间】:2012-02-20 10:53:41
【问题描述】:

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

我认为很难找到这样一个无法以其他方式建模的示例。

编辑:我的意思是,有人可以给我举一个真实的例子,说明你何时需要使用多重继承来尽可能干净地实现这个例子。它不应该使用多个接口,就像你可以在 C++ 中继承多个类一样。

【问题讨论】:

  • 您接受了Luchian Grigore's answer,但您真的满意吗?我认为这是一个非常好的问题 (+1),但可能不适合 SO,因为它可能没有真正的答案可以说服关键的程序员。
  • 我不是很满意。以前我不得不和一个挑剔的程序员争论,他不喜欢这种争论。老实说,我只是放弃了:D
  • 那么最好不要接受“答案”,它只不过是一个(可怜的)维基百科示例的稀疏装饰引用。也许将来会有人给出真正的答案-不,很可能不是我:-)

标签: oop language-agnostic multiple-inheritance


【解决方案1】:

以下是经典:

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

【讨论】:

  • 这是通过接口完成的,我不想像在 C++ 中那样使用 FULL 类继承。
  • @PhilippSpieß 是哪些接口?
  • @PhilippSpieß 还有,什么是全类继承?
  • 您的示例类中的@LuchianGrigore 可以与接口互换,这没有区别
  • 我认为breathe作为哺乳动物类的典型创新并不是一个好的选择。好吧,这是维基百科的错,但为什么要引用它呢?
【解决方案2】:

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

通知客户的简化版本在 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 在他的《面向对象的软件构造》一书中所述”。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 2021-11-02
    • 2011-07-19
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多