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