2009-10-21 88 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