15

我想保持这个简短。我建造了一个有两个房间的 HouseA,比如说BedRoomStudyRoom,它们都派生自一个名为 的基类RoomBedRoomStudyRoom有一个相同的父母称为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。注意 和 的大部分属性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() = 4logicalBedRoom->noOfSides() = ??。这是继承的好用吗?

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

谢谢

4

1 回答 1

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

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

于 2009-10-21T06:25:20.487 回答