Ich möchte dies kurz halten. Ich baue ein HouseA, das zwei Räume hat, sagen BedRoom
und StudyRoom
, die beide von einer Basisklasse Room
stammen. BedRoom
und StudyRoom
haben einen gleichen Elternteil namens House
. Außerdem kann jedes Zimmer in einem Haus nur durch die Eltern auf andere Räume zugreifen. Wenn BedRoom
auf ein Attribut von StudyRoom
zugreifen muss, muss es nur über House
(d. H. Eltern) und umgekehrt gehen.Soll ich Vererbung oder Zusammensetzung verwenden?
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Jetzt das Problem: Lassen Sie uns sagen, dass ich ein anderes Haus bauen (sagen wir HouseB
), die eine genau die gleiche wie die oben ist, aber mit einer Änderung. Ich möchte nicht zwei getrennte Räume (d. H. BedRoom
und StudyRoom
), sondern stattdessen ein einzelnes Zimmer (MasterRoom
), das diese beiden Einrichtungen hat. Aus Gründen der Wiederverwendbarkeit von Code, konnte ich die folgenden Gestaltungsmöglichkeiten denken:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Hier habe ich die Fähigkeit verlieren, die Attribute von BedRoom
und StudyRoom
, die ich für HouseA
erstellt wiederzuverwenden. Beachten Sie, dass die meisten Attribute von BedRoom
und StudyRoom
trotzdem in MasterRoom
erneut implementiert werden müssen, was zu Code-Duplizierung führt.
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS LogicalStudyRoom
LogicalBedroom ISA BedRoom
LogicalStudyRoom ISA StudyRoom
Auf diese Weise verwende ich Zusammensetzung so, dass ich die meisten meiner Code wiederverwenden könnte (ich habe mehrere tausend Zeilen Code, die ich wieder verwenden könnte), aber das Problem ist, dass BedRoom
eine konkrete Klasse ist und logicalBedRoom
finden Bestimmte Attribute sind nicht geeignet und können gezwungen sein, Methoden zu überschreiben, so dass sie nichts tun. Zum Beispiel Bedroom->noOfSides() = 4
und logicalBedRoom->noOfSides() = ??
. Ist das eine gute Verwendung der Vererbung?
Mein aktuelles Design ist für einen komplexen Chip, der die Funktionalität von zwei einzelnen Chips kombiniert (ich verwendete House (Motherboard) und Room (Chip) Analogie). Ich Code in objektorientierte Perl und ich würde wirklich jede alternative Design-Vorschläge zu schätzen wissen.
Dank
Ist die Rolle identisch mit Mixin in Ruby? – rpattabi
@ ragu.pattabi, Rollen sind ähnlich wie Mixins. Der Hauptunterschied besteht darin, dass Rollen einige Steuerelemente haben, wenn sie angewendet werden können - Rollen können erfordern, dass bestimmte Methoden in einer konsumierenden Klasse verfügbar sind. Es gibt auch andere Unterschiede. Die Verwendung des Begriffes "Rolle" wird in der größeren Welt der OO-Forschung als "Merkmal" bezeichnet. In Perl/Moose ist eine Eigenschaft eine Rolle, die auf eine Methode angewendet wird, die das Meta-Objekt-Protokoll verwendet, was den Rahmen dieser Antwort sprengen würde. Ich hebe den Punkt auf, damit ich das Auftreten von Nicht-Sequitor vermeiden kann, da ich Sie auf eine Ressource zu Merkmalen im Allgemeinen hinweise: http://scg.unibe.ch/research/traits/ – daotoad
Das bedeutet, dass Rollen einen Mechanismus wie die Schablonenmethode bereitstellen Muster ohne das Erbe des Erbes. Das ist ziemlich interessant. – rpattabi