Poiché l'ereditarietà multipla è dannosa (rende la fonte più complicata) C # non fornisce direttamente un tale modello. Ma a volte sarebbe utile avere questa capacità.
Ad esempio, sono in grado di implementare il modello di ereditarietà multipla mancante usando interfacce e tre classi simili:
public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }
public class First:IFirst
{
public void FirstMethod() { Console.WriteLine("First"); }
}
public class Second:ISecond
{
public void SecondMethod() { Console.WriteLine("Second"); }
}
public class FirstAndSecond: IFirst, ISecond
{
First first = new First();
Second second = new Second();
public void FirstMethod() { first.FirstMethod(); }
public void SecondMethod() { second.SecondMethod(); }
}
Ogni volta che aggiungo un metodo a una delle interfacce, devo cambiare anche la classe FirstAndSecond .
C'è un modo per iniettare più classi esistenti in una nuova classe come è possibile in C ++?
Forse esiste una soluzione che utilizza un qualche tipo di generazione del codice?
Oppure può apparire così (sintassi c # immaginaria):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
In modo che non sia necessario aggiornare la classe FirstAndSecond quando modifico una delle interfacce.
MODIFICARE
Forse sarebbe meglio considerare un esempio pratico:
Hai una classe esistente (ad esempio un client TCP basato su testo basato su ITextTcpClient) che usi già in diverse posizioni all'interno del tuo progetto. Ora senti la necessità di creare un componente della tua classe per renderlo facilmente accessibile agli sviluppatori di moduli Windows.
Per quanto ne so, attualmente hai due modi per farlo:
Scrivi una nuova classe ereditata dai componenti e implementa l'interfaccia della classe TextTcpClient usando un'istanza della classe stessa come mostrato con FirstAndSecond.
Scrivi una nuova classe che eredita da TextTcpClient e in qualche modo implementa IComponent (non l'ho ancora provato).
In entrambi i casi devi lavorare per metodo e non per classe. Dato che sai che avremo bisogno di tutti i metodi di TextTcpClient e Component, sarebbe la soluzione più semplice combinare questi due in una sola classe.
Per evitare conflitti, ciò può essere fatto mediante la generazione di codice in cui il risultato potrebbe essere modificato in seguito, ma digitarlo a mano è un vero dolore nel culo.