Wie die Umsetzung Mehrfachvererbung in delphi?
Mache ich ein komplettes Neuschreiben der alten Bibliothek, und ich bin nicht sicher, wie mit dieser situation umzugehen (für den Willen, verstanden zu werden, alle Hagel die Fahrrad-Analogie):
Habe ich die folgenden Klassen:
TBike
- das bike selbstTBikeWheel
- einer der bike RadTBikeWheelFront
undTBikeWheelBack
beide erbt vonTBikeWheel
und implementiert dann die bestimmten Sachen, die Sie benötigen auf der Oberseite der es
Dies ist ziemlich einfach, aber jetzt habe ich entscheiden, zu erstellen, die mehrere Art von Fahrrädern, die einzelnen Räder mit einem eigenen Arten von Rad -, Sie tun das gleiche Zeug wie eine regelmäßige vorn/hinten Räder, plus die spezifisch für das Fahrrad.
TBikeXYZ
- erbt vonTBike
TBikeWheelXYZ
- erbt vonTBikeWheel
Und hier ist mein problem: TBikeWheelFrontXYZ
Erben sollen von TBikeWheelXYZ
(um die konkreten Methoden der XYZ-Rad), aber es sollten auch Erben von TBikeWheelFront
(um die spezifischen Methoden, die von einem Vorderrad).
Meine Frage hier ist, wie kann ich das umsetzen, dass in einer Weise, die nicht:
- fühlen Sie sich wie ein hack
- mich zwingen, zu schreiben, die den gleichen code mehrere mal
InformationsquelleAutor der Frage Lepidosteus | 2009-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Delphi unterstützt keine Mehrfache Vererbung. Aber Klassen können support /mehrere interfaces implementieren, und Sie können delegieren-Schnittstelle-Implementierung, so kann man irgendwie simulieren, multiple inheritence.
InformationsquelleAutor der Antwort Tim Jarvis
Schnittstellen verwenden. So etwas wie dieses (Aus der Spitze von meinem Kopf, basierend auf Ihrer Beschreibung.....)
Implementieren Sie Klassen für die Schnittstellen, die das tun, was die entsprechenden Klassen in den alten (vermutlich C/C++) - Bibliothek tut und instanziieren Sie in den entsprechenden Klassen-Konstruktor.
InformationsquelleAutor der Antwort Nick Hodges
Verwenden polymorhism zu implment jedes 'Ding', als Objekt-Hierarchie in seinem eigenen Recht, und dann hinzufügen von Objekt-Eigenschaften, um das Objekt in der Reihe. So erstellen Sie eine Hierarchie von Rädern, und eine Hierarchie von Fahrrädern. Dann fügen Sie Räder auf Fahrräder, wie Felder in der Vorgänger-bike-Objekt. Siehe unten.
InformationsquelleAutor der Antwort Brian Frost
Grundsätzlich - das KÖNNEN Sie NICHT. Delphi unterstützt keine mehrfache Vererbung.
Also Links, die mit diesem dilemma ist die Frage: könntest du eventuell umgestalten, dass die Bibliothek in einer Weise, die Sie bekommen können Weg mit der Verwendung von interface? Ist die mehrfache Vererbung meist über Funktionen und Methoden? Wenn ja - Schnittstellen verwenden. Delphi-Unterstützung für mehrere Schnittstellen in einer Klasse.
Wenn die multi-Vererbung mehr über Vererbung eigentliche Funktionalität in die Klassen, dann sind Sie wahrscheinlich auf der Suche bei einem größeren refactoring, fürchte ich. Sie müssen einen Weg finden, zu brechen, bis die funktionalen Abhängigkeiten in einer solchen Art und Weise können Sie machen es Erben von einer einzigen Basisklasse, vielleicht mit einigen zusätzlichen Schnittstellen geworfen.
Sorry, ich kann nicht eine einfache Antwort - das ist nur die Realität.
Marc
InformationsquelleAutor der Antwort marc_s
Können Sie versuchen, zu extrahieren, eine Schnittstelle, die sagen IFrontWheel, aus TBikeWheelFront, so dass es eine Unterklasse von TBikeWheel aber implementiert IFrontWheel. Dann TBikeWheelXYZ erbt von TBikeWheel und TBikeWheelFrontXYZ erbt von TBikeWheelXYZ und implementiert IFrontWheel.
Dann können Sie eine Klasse definieren, TFrontwheel und geben Sie die gleichen Methoden wie die Schnittstelle, aber jetzt, Sie zu verwirklichen. Dann TBikeWheelFront und TBikeWheelXYZ bekommen einen private member vom Typ TFrontwheel und die IFrontWheel Implementierungen einfach delegieren an den privaten member-Methoden.
Diese Weise müssen Sie nicht die doppelte Implementierungen.
InformationsquelleAutor der Antwort Ozan
Einer variation von Brian Frost Vorschlag:
InformationsquelleAutor der Antwort Uwe Raabe
Andere alternative mit neueren Versionen von Delphi ist die Nutzung von Generika in ein kompositorisches Modell. Dies ist besonders nützlich in dem Fall, wo die mehreren Basisklassen (
TBarA
undTBarB
in diesem Beispiel) sind nicht zugänglich für änderungen (sprich: framework oder die Bibliothek Klassen). Zum Beispiel (beachte, die notwendigendestructor
imTFoo<T>
ist hier weggelassen aus Platzgründen) :InformationsquelleAutor der Antwort J...
können Sie versuchen auf diese Weise, wenn Sie nicht möchten, wiederholen Sie den code mehrmals und wollen eine entkoppelte code.
InformationsquelleAutor der Antwort Passella
Sorry, Delphi keine Mehrfachvererbung.
InformationsquelleAutor der Antwort Dauezevy