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

raj*_*han 15 oop perl inheritance composition

我想简短一点.我建有两间HouseA,说BedRoomStudyRoom,从所谓的基类派生两者Room. BedRoom并且StudyRoom有一个同一个父母叫House.此外,房屋内的任何房间只能通过父母进入任何其他房间.如果BedRoom必须访问任何属性StudyRoom,它必须只通过House(即父),反之亦然.

HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room
Run Code Online (Sandbox Code Playgroud)

现在的问题:让我们说,我建造另一个家(比方说HouseB),这与上面完全相同,但只有一个改变.我不想要两个单独的房间(即BedRoomStudyRoom),而是一个房间(MasterRoom),这两个房间都有这些设施.为了代码可重用性,我可以想到以下设计选项:

Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room
Run Code Online (Sandbox Code Playgroud)

在这里,我失去了再利用的属性的能力BedRoomStudyRoom我的创造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
Run Code Online (Sandbox Code Playgroud)

这样,我使用组合,以便我可以重用我的大部分代码(我有几千行代码,我可以重用),但问题是这BedRoom是一个具体的类,logicalBedRoom可能会发现某些属性不合适,可能被迫覆盖方法,使它们什么也不做.例如,Bedroom->noOfSides() = 4logicalBedRoom->noOfSides() = ??.这是继承的好用吗?

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

谢谢

dao*_*oad 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
Run Code Online (Sandbox Code Playgroud)

获得角色的最简单方法是使用Moose.