我应该使用继承还是组合?

时间:2009-10-21 04:32:46

标签: perl inheritance oop composition

我想简短一点。我构建了一个有两个房间的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

我失去了重用我为BedRoom创建的StudyRoomHouseA属性的功能。请注意,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是一个具体的类,{{1可能会发现某些属性不合适,可能会强制重写方法,以便它们什么也不做。例如,logicalBedRoomBedroom->noOfSides() = 4。这是继承的好用吗?

我的实际设计是针对一个复杂的芯片,它结合了两个独立芯片的功能(我使用House(主板)和Room(芯片)类比)。我在面向对象的Perl中编码,我真的很感激任何替代设计建议。

由于

1 个答案:

答案 0 :(得分: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