我想保留这一短。我建立了一个有两个房间的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