我想保留這一短。我建立了一個有兩個房間的HouseA,分別是BedRoom
和StudyRoom
,這兩個房間都來自一個名爲Room
的基類。 BedRoom
和StudyRoom
有一個相同的父母House
。此外,房屋內的任何房間都只能通過父母進入任何其他房間。如果BedRoom
必須訪問StudyRoom
的任何屬性,則必須僅通過House
(即父級)進行訪問,反之亦然。我應該使用繼承還是組合?
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
現在的問題:比方說,我再建家園(比如HouseB
),這是一個完全一樣上面,但有一個變化。我不想要兩個單獨的房間(即BedRoom
和StudyRoom
),而是擁有這兩個設施的單個房間(MasterRoom
)。 對於代碼的可重用的緣故,我能想到的以下設計方案:
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
在這裏,我失去了再利用的BedRoom
和StudyRoom
,我爲HouseA
創建的屬性的能力。請注意,BedRoom
和StudyRoom
的大多數屬性無論如何都需要在MasterRoom
中重新實現,從而導致代碼重複。
Option-2:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
MasterRoom HAS LogicalBedroom
MasterRoom HAS LogicalStudyRoom
LogicalBedroom ISA BedRoom
LogicalStudyRoom ISA StudyRoom
這樣,我用的組合物,這樣我可以重用我的大部分代碼(我有幾千行代碼,我可以重複使用),但問題是,BedRoom
是一個具體的類和logicalBedRoom
可能會發現某些屬性不適合,可能會被迫覆蓋方法,以免它們無所作爲。例如,Bedroom->noOfSides() = 4
和logicalBedRoom->noOfSides() = ??
。這是繼承的好用嗎?
我的實際設計是一個複合芯片,它結合了兩個獨立芯片(我用House(主板)和Room(芯片)類比)的功能。我在面向對象的Perl中編寫代碼,我非常感謝任何備用的設計建議。
感謝
角色與Ruby中的Mixin相同嗎? – rpattabi 2011-01-20 18:33:33
@ ragu.pattabi,角色類似於mixin。主要區別在於,角色可以在何時應用這些角色時進行控制 - 角色可能要求某些方法在消費類中可用。還有其他的不同之處。術語角色的Perl用法映射到面向對象研究的更大世界中的「特徵」。在Perl/Moose中,trait是應用於使用元對象協議的方法的角色,這超出了本回復的範圍。我提出這個觀點,以便我可以避免出現非限制性因素,因爲我會將您指向一般性狀的資源:http://scg.unibe.ch/research/traits/ – daotoad 2011-01-21 15:12:50
這意味着角色提供類似模板方法的機制模式沒有繼承的行李。這很有趣。 – rpattabi 2011-01-22 03:17:45