2009-10-21 83 views
15

我想保留這一短。我建立了一個有兩個房間的HouseA,分別是BedRoomStudyRoom,這兩個房間都來自一個名爲Room的基類。 BedRoomStudyRoom有一個相同的父母House。此外,房屋內的任何房間都只能通過父母進入任何其他房間。如果BedRoom必須訪問StudyRoom的任何屬性,則必須僅通過House(即父級)進行訪問,反之亦然。我應該使用繼承還是組合?

HouseA ISA House 
HouseA HAS BedRoom and StudyRoom. 
BedRoom ISA Room 
StudyRoom ISA Room 

現在的問題:比方說,我再建家園(比如HouseB),這是一個完全一樣上面,但有一個變化。我不想要兩個單獨的房間(即BedRoomStudyRoom),而是擁有這兩個設施的單個房間(MasterRoom)。 對於代碼的可重用的緣故,我能想到的以下設計方案:

Option-1: 
HouseB ISA House 
HouseB HAS MasterRoom 
MasterRoom ISA Room 

在這裏,我失去了再利用的BedRoomStudyRoom,我爲HouseA創建的屬性的能力。請注意,BedRoomStudyRoom的大多數屬性無論如何都需要在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() = 4logicalBedRoom->noOfSides() = ??。這是繼承的好用嗎?

我的實際設計是一個複合芯片,它結合了兩個獨立芯片(我用House(主板)和Room(芯片)類比)的功能。我在面向對象的Perl中編寫代碼,我非常感謝任何備用的設計建議。

感謝

回答

19

爲什麼不使用角色來實現這一目標:

House A has a Bedroom 
Bedroom does SleepingArea 
House has a Studyroom 
Studyroom does ComfyArea 

House B has a MasterRoom 
MasterRoom does SleepingArea and ComfyArea 

得到roles最簡單的方法是使用Moose

+1

角色與Ruby中的Mixin相同嗎? – rpattabi 2011-01-20 18:33:33

+1

@ ragu.pattabi,角色類似於mixin。主要區別在於,角色可以在何時應用這些角色時進行控制 - 角色可能要求某些方法在消費類中可用。還有其他的不同之處。術語角色的Perl用法映射到面向對象研究的更大世界中的「特徵」。在Perl/Moose中,trait是應用於使用元對象協議的方法的角色,這超出了本回復的範圍。我提出這個觀點,以便我可以避免出現非限制性因素,因爲我會將您指向一般性狀的資源:http://scg.unibe.ch/research/traits/ – daotoad 2011-01-21 15:12:50

+0

這意味着角色提供類似模板方法的機制模式沒有繼承的行李。這很有趣。 – rpattabi 2011-01-22 03:17:45