複数のクラス継承が意味を成す例は、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 "
あなたは [Luchian Grigoreの回答](http://stackoverflow.com/a/9360014/2932052)を受け入れましたが、本当に満足していますか?私はこれは非常に良い質問だと思いますが(+1)、それは重要なプログラマーを納得させる本当の答えがないかもしれないので、そうではないかもしれません。 – Wolf
私はあまり満足していません。私は重要なプログラマーと議論しなければならなかった。彼はその議論を好まなかった。私は単純にそれを正直に言い渡しました:D –
それでは、(貧弱な)ウィキペディアの例の疎な装飾された引用だけである「答え」を受け入れないほうがよいかもしれません。たぶん、本当の答えを持つ人がいるでしょう - いいえ、おそらく私ではないでしょう:-) – Wolf