我想简短一点。我构建了一个有两个房间的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
是一个具体的类,{{1可能会发现某些属性不合适,可能会强制重写方法,以便它们什么也不做。例如,logicalBedRoom
和Bedroom->noOfSides() = 4
。这是继承的好用吗?
我的实际设计是针对一个复杂的芯片,它结合了两个独立芯片的功能(我使用House(主板)和Room(芯片)类比)。我在面向对象的Perl中编码,我真的很感激任何替代设计建议。
由于