Da die Mehrfachvererbung schlecht ist (was die Quelle komplizierter macht), liefert C # ein solches Muster nicht direkt. Aber manchmal wäre es hilfreich, diese Fähigkeit zu haben.
Zum Beispiel kann ich das fehlende Mehrfachvererbungsmuster mithilfe von Schnittstellen und drei Klassen wie diesen implementieren:
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(); }
}
Jedes Mal, wenn ich einer der Schnittstellen eine Methode hinzufüge, muss ich auch die Klasse FirstAndSecond ändern .
Gibt es eine Möglichkeit, mehrere vorhandene Klassen in eine neue Klasse einzufügen, wie dies in C ++ möglich ist?
Vielleicht gibt es eine Lösung mit einer Art Codegenerierung?
Oder es könnte so aussehen (imaginäre c # -Syntax):
public class FirstAndSecond: IFirst from First, ISecond from Second
{ }
Damit die Klasse FirstAndSecond nicht aktualisiert werden muss, wenn ich eine der Schnittstellen ändere.
BEARBEITEN
Vielleicht wäre es besser, ein praktisches Beispiel zu betrachten:
Sie haben eine vorhandene Klasse (z. B. einen textbasierten TCP-Client, der auf ITextTcpClient basiert), die Sie bereits an verschiedenen Stellen in Ihrem Projekt verwenden. Jetzt müssen Sie eine Komponente Ihrer Klasse erstellen, die für Windows Forms-Entwickler leicht zugänglich ist.
Soweit ich weiß, haben Sie derzeit zwei Möglichkeiten, dies zu tun:
Schreiben Sie eine neue Klasse, die von Komponenten geerbt wird und die Schnittstelle der TextTcpClient-Klasse mithilfe einer Instanz der Klasse selbst implementiert, wie in FirstAndSecond gezeigt.
Schreiben Sie eine neue Klasse, die von TextTcpClient erbt und IComponent irgendwie implementiert (haben dies noch nicht ausprobiert).
In beiden Fällen müssen Sie pro Methode und nicht pro Klasse arbeiten. Da Sie wissen, dass wir alle Methoden von TextTcpClient und Component benötigen, ist es die einfachste Lösung, diese beiden Methoden in einer Klasse zu kombinieren.
Um Konflikte zu vermeiden, kann dies durch Codegenerierung erfolgen, bei der das Ergebnis später geändert werden kann, aber das Eingeben von Hand ist ein reiner Schmerz im Arsch.