我想保持这个简短。我建造了一个有两个房间的 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 中编码,我非常感谢任何替代设计建议。
谢谢