Chciałbym zachować ten skrót. Buduję dom A, który ma dwa pokoje, na przykład BedRoom
i StudyRoom
, oba wywodzące się z klasy bazowej o nazwie Room
. BedRoom
i StudyRoom
mają tego samego rodzica o nazwie House
. Ponadto każdy pokój w domu może uzyskać dostęp do innych pomieszczeń tylko za pośrednictwem rodzica. Jeśli BedRoom
ma uzyskać dostęp do dowolnego atrybutu StudyRoom
, musi przejść tylko przez House
(tj. Nadrzędny) i na odwrót.Czy powinienem używać dziedziczenia lub kompozycji?
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Teraz problem: Powiedzmy, że budowa kolejnego domu (słownie HouseB
), która jest dokładnie taka sama jak wyżej, ale z jedną zmianą. Nie chcę dwóch oddzielnych pokoi (tj. BedRoom
i StudyRoom
), ale zamiast tego pojedynczy pokój (MasterRoom
), który ma obie te funkcje. Dla kodu ponownego użycia, mogę myśleć o następujących opcji projektowych:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Here I tracą zdolność do ponownego użycia atrybuty BedRoom
i StudyRoom
, który został utworzony dla HouseA
. Zauważ, że większość atrybutów BedRoom
i StudyRoom
musi zostać ponownie zaimplementowana w MasterRoom
, co spowoduje duplikację kodu.
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS LogicalStudyRoom
LogicalBedroom ISA BedRoom
LogicalStudyRoom ISA StudyRoom
ten sposób, używam kompozycję, abym mógł ponownie wykorzystać większość mojego kodu (mam kilka tysięcy linii kodu, który mógłby I ponownego wykorzystania), ale problemem jest to, że BedRoom
jest beton klasy i logicalBedRoom
mogą znaleźć niektóre atrybuty nie są odpowiednie i mogą być zmuszone do nadpisania metod, aby nic nie zrobiły. Na przykład Bedroom->noOfSides() = 4
i logicalBedRoom->noOfSides() = ??
. Czy to jest dobre wykorzystanie dziedzictwa?
Moja aktualna konstrukcja dotyczy złożonego układu scalonego, który łączy w sobie funkcjonalność dwóch pojedynczych układów scalonych (użyłem analogii House (płyta główna) i Room (chip)). Koduję w Object Oriented Perl i naprawdę doceniam wszelkie alternatywne sugestie dotyczące projektu.
Dzięki
Czy Role jest takie samo jak Mixin w Ruby? – rpattabi
@ ragu.pattabi, role są podobne do mixin. Główna różnica polega na tym, że role mają kontrolę nad tym, kiedy można je zastosować - role mogą wymagać, aby pewne metody były dostępne w klasie konsumującej. Są też inne różnice. Perl wykorzystanie terminu rola mapy do "cech" w szerszym świecie badań OO. W Perlu/Łosie cecha jest rolą stosowaną w metodzie wykorzystującej protokół meta-obiektu, która wykracza poza zakres tej odpowiedzi. Podnoszę kwestię, aby uniknąć pojawiania się niesekwencjonujących, gdy kieruję cię do zasobu o cechach w ogólności: http://scg.unibe.ch/research/traits/ – daotoad
Oznacza to, że role zapewniają mechanizm taki jak metoda szablonu wzór bez bagażu dziedziczenia. To całkiem interesujące. – rpattabi