2012-02-20 53 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在其着作「面向對象的軟件構造」。