关于perl:我应该使用继承还是组合?

Should I use inheritance or composition?

我想把这个短一点。我建造了一个有两个房间的房子,如BedRoomStudyRoom,这两个房间都来自一个名为Room的基类。BedRoomStudyRoom有一个相同的父母,叫做House。而且,房子里的任何房间只能通过父母进入其他房间。如果BedRoom必须访问StudyRoom的任何属性,则只能通过House访问(即父级),反之亦然。

1
2
3
4
HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room

现在的问题是:假设,我建造了另一个房子(比如说HouseB),这和上面的完全一样,但是有一个变化。我不想要两个单独的房间(即BedRoomStudyRoom),而想要一个有这两个设施的单人房间(MasterRoom)。为了代码的可重用性,我可以考虑以下设计选项:

1
2
3
4
Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room

在这里,我失去了重用我为HouseA创建的BedRoomStudyRoom属性的能力。注意,BedRoomStudyRoom的大部分属性无论如何都需要在MasterRoom中重新实现,从而导致代码重复。

1
2
3
4
5
6
7
8
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编写代码,我真的很感激任何其他的设计建议。

谢谢


为什么不利用角色来实现这一点:

1
2
3
4
5
6
7
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

获得角色的最简单方法是使用驼鹿。