Un esempio in cui l'ereditarietà di classi multiple ha senso è il pattern Observer. Questo schema descrive due attori, l'osservatore e l'osservabile, e il primo vuole essere avvisato quando quest'ultimo cambia lo stato dell'oggetto.
Una versione semplificata di notifica client può apparire come questo in 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();
}
}
Questa in sostanza è la logica di base è necessario informare tutti gli osservatori registrati. È possibile rendere qualsiasi classe osservabile derivando da questa classe, ma poiché C# supporta solo l'ereditarietà di una singola classe, si è limitati a non derivare da un'altra classe. Qualcosa del genere non avrebbe funzionato:
public class ImportantBaseClass { /* Members */ }
public class MyObservableSubclass : ImportantBaseClass, Observable { /* Members */ }
In questi casi si deve spesso di replicare il codice che fa sottoclassi osservabili in tutti loro, in fondo violare la non ripetere te stesso e l'unico punto di principi di verità (se hai fatto MVVM in C#, pensaci: quanto spesso hai implementato l'interfaccia INotifyPropertyChanged
?). Una soluzione con eredità di classe multipla sarebbe molto più pulita a mio parere. In C++, l'esempio sopra sarebbe compilato bene.
Uncle Bob wrote an interesting article about this, da cui ho tratto l'esempio. Ma questo problema si applica spesso a tutte le interfacce che sono * in grado (eg confrontabile, equabile, enumerabile, ecc.): Una versione di ereditarietà di classi multiple è spesso più pulita in questi casi, come affermato da Bertrand Meyer nel suo libro "Object-Oriented Software Construction ".
Hai accettato [risposta di Luchian Grigore] (http://stackoverflow.com/a/9360014/2932052), ma sei davvero soddisfatto? Penso che questa sia una buona domanda (+1), ma forse non per SO, perché potrebbe non avere una risposta reale che possa convincere il programmatore critico. – Wolf
Non sono molto soddisfatto. Ho dovuto discutere con un programmatore critico nel corso della giornata e non gli piaceva l'argomento. Ho semplicemente rinunciato ad essere sincero: D –
Quindi è forse meglio non accettare la "risposta" che non è altro che una citazione sparsa decorata di un (povero) esempio di Wikipedia. Forse ci sarà qualcuno con una vera risposta in futuro - no, molto probabilmente non io :-) – Wolf