2012-04-11 15 views
1

Ich frage mich, was getan werden sollte, wenn Sie Rollen oder Eigenschaften benötigen, aber in einer klassischen Vererbungsumgebung. Ich stamme von einer Klasse auf zwei Straßen, die beide aus einer Wurzelklasse stammen, aber ich möchte die divergenten Klassen auf den beiden Straßen miteinander verbinden, um die gleiche Funktionalität zu teilen. Siehe unten:Klassische Vererbung Divergenz

+-- Base 
+-- Base_Processor 
| +-- Base_Processor_Request 
| +-- Base_Processor_Request_Ajax 
+-- Base_Impl 
    +-- Base_Impl_MyImpl 
    +-- Base_Impl_MyImpl_Processor (extends from Base_Processor) 
    +-- Base_Impl_MyImpl_Processor_Request (extends from ??) 
    +-- Base_Impl_MyImpl_Processor_Request_Ajax (extends from ??) 

was der beste Weg wäre, Base_Impl_MyImpl_Processor_Request und Base_Processor_Request miteinander zu verbinden, während immer noch von Base_Impl_MyImpl_Processor erstreckt, und auch Base_Impl_MyImpl_Processor_Request_Ajax in der gleichen Art und Weise verbinden.

Danke in fortgeschrittenem.

+2

Zusammensetzung über Vererbung bevorzugen. –

Antwort

2

Ich stimme zu 100% mit Alex Burtsev 's Kommentar - dass viele Ebenen der Vererbung wie eine Abhängigkeit Albtraum aussieht (und, wie Sie feststellen, ziemlich schwierig, bestimmte Bits des Codes über Klassen hinweg zu verwenden, wenn Sie die Vererbung verwenden so viel) .

Normalerweise würde ich nicht Merkmal Klassen erwartet in eine Hierarchie eingesteckt werden - meiner Meinung nach, Züge sind eigenständige Konzepte, die Unterschiede zwischen den Implementierungsdetails zu definieren, und daher nur zu einer Schnittstelle gehören, anstatt von einer Basis abgeleitet wurde Klasse

Wenn dies bereits existierender Code ist und Sie mehrere Elemente haben, die Sie zwischen verschiedenen abgeleiteten Klassen wiederverwenden müssen, wäre es sinnvoller, diese in separate Klassen aufzuteilen, die überhaupt nicht mit Ihrer Hierarchie zusammenhängen.

Es scheint, dass Processor, Request und Ajax könnte Ihnen besser als separate Einheiten dienen.

+0

Also, korrigieren Sie mich, wenn ich falsch liege, aber Sie sagen, dass ich diese in Schnittstellen machen sollte, und Code nicht über Base und Impl wiederverwenden, richtig? Aber sie werden beide die gleichen Schnittstellen implementieren. Danke für Ihre Antwort, übrigens! – Kyle

+0

Vergiss es. Ich habe herausgefunden, was du meinst [Komposition gegen Vererbung] (http://www.artima.com/designtechniques/compoinh.html) Danke! – Kyle