Ich komme aus einem C++-Hintergrund und bin an Mehrfachvererbung gewöhnt. Ich mag das Gefühl einer Schrotflinte, die direkt auf meinen Fuß gerichtet ist. Heutzutage arbeite ich mehr in C# und Java, wo man nur eine Basisklasse erben, aber eine beliebige Anzahl von Schnittstellen implementieren kann (habe ich die Terminologie richtig verstanden?).
Nehmen wir zum Beispiel zwei Klassen, die eine gemeinsame Schnittstelle implementieren, aber unterschiedliche (aber erforderliche) Basisklassen:
public class TypeA : CustomButtonUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
public class TypeB : CustomTextUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
Beide Klassen sind UserControl
s, so dass ich die Basisklasse nicht ersetzen kann. Beide müssen die DoMagic
Funktion. Mein Problem ist nun, dass beide Implementierungen der Funktion identisch sind. Und ich hasse Copy-and-Paste-Code.
Die (möglichen) Lösungen:
- Ich möchte natürlich
TypeA
yTypeB
eine gemeinsame Basisklasse zu teilen, in der ich die identische Funktionsdefinition nur einmal schreiben kann. Aufgrund der Beschränkung auf nur eine Basisklasse kann ich jedoch keinen Platz in der Hierarchie finden, an den sie passt. - Man könnte auch versuchen, eine Art von zusammengesetztes Muster . Das Einsetzen der
DoMagic
Funktion in einer separaten Hilfsklasse, aber die Funktion hier benötigt (und ändert) eine ganze Reihe von internen Variablen/Feldern. Sie alle als (Referenz-)Parameter zu senden, würde einfach schlecht aussehen. - Mein Gefühl sagt mir, dass die Adapterschema könnte hier einen Platz haben, eine Klasse, die bei Bedarf zwischen den beiden konvertiert. Aber es fühlt sich auch hakelig an.
Ich habe dies als sprachenunabhängig gekennzeichnet, da es für alle Sprachen gilt, die diesen Ansatz "eine Basisklasse - viele Schnittstellen" verwenden.
Bitte weisen Sie mich auch darauf hin, wenn ich eines der von mir genannten Muster missverstanden habe.
In C++ würde ich einfach eine Klasse mit den privaten Feldern und der Funktionsimplementierung erstellen und sie in die Vererbungsliste aufnehmen. Was ist der richtige Ansatz in C#/Java und dergleichen?