2012-02-20 18 views
10

私は、複数の継承を使用するための良い例を、通常のインターフェースでは実行できないものにしようとしています。複数継承:どのような良い例ですか?

私は、別の方法でモデル化できないような例を見つけるのはかなり難しいと思います。

編集:私は、あなたができるだけきれいにこの例を実装するために複数の継承を使用する必要があるときの良い現実的な例を私に挙げることができます。また、C++で複数のクラスを継承する方法と同じように、複数のインタフェースを使用すべきではありません。

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

あなたは [Luchian Grigoreの回答](http://stackoverflow.com/a/9360014/2932052)を受け入れましたが、本当に満足していますか?私はこれは非常に良い質問だと思いますが(+1)、それは重要なプログラマーを納得させる本当の答えがないかもしれないので、そうではないかもしれません。 – Wolf

+1

私はあまり満足していません。私は重要なプログラマーと議論しなければならなかった。彼はその議論を好まなかった。私は単純にそれを正直に言い渡しました:D –

+0

それでは、(貧弱な)ウィキペディアの例の疎な装飾された引用だけである「答え」を受け入れないほうがよいかもしれません。たぶん、本当の答えを持つ人がいるでしょう - いいえ、おそらく私ではないでしょう:-) – Wolf

答えて

7

次は古典的です。

+1

これはインターフェイスで行われます。私はC++で可能なFULLクラスの継承を利用しています。 –

+0

@PhilippSpießはどのインターフェースですか? –

+0

@PhilippSpießまた、フルクラスの継承は何ですか? –

2

複数のクラス継承が意味を成す例は、Observerパターンです。このパターンはオブザーバとオブザーバブルの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の著書「Object-Oriented Software Construction "

関連する問題