Should I use inheritance or composition?
我想把这个短一点。我建造了一个有两个房间的房子,如BedRoom和StudyRoom,这两个房间都来自一个名为Room的基类。BedRoom和StudyRoom有一个相同的父母,叫做House。而且,房子里的任何房间只能通过父母进入其他房间。如果BedRoom必须访问StudyRoom的任何属性,则只能通过House访问(即父级),反之亦然。
1 2 3 4
| HouseA ISA House
HouseA HAS BedRoom and StudyRoom.
BedRoom ISA Room
StudyRoom ISA Room |
现在的问题是:假设,我建造了另一个房子(比如说HouseB),这和上面的完全一样,但是有一个变化。我不想要两个单独的房间(即BedRoom和StudyRoom),而想要一个有这两个设施的单人房间(MasterRoom)。为了代码的可重用性,我可以考虑以下设计选项:
1 2 3 4
| Option-1:
HouseB ISA House
HouseB HAS MasterRoom
MasterRoom ISA Room |
在这里,我失去了重用我为HouseA创建的BedRoom和StudyRoom属性的能力。注意,BedRoom和StudyRoom的大部分属性无论如何都需要在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() = 4和logicalBedRoom->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 |
获得角色的最简单方法是使用驼鹿。
- 角色和Ruby中的mixin相同吗?
- @帕塔比,角色类似于混音。主要的区别在于角色对何时可以应用它们有一些控制——角色可以要求某些方法在消费类中可用。还有其他的区别。角色这个术语的Perl用法映射到更大的OO研究领域中的"特性"。在Perl/Moose中,一个特征是应用于使用元对象协议的方法的角色,这超出了这个回复的范围。我提出了这一点,这样我就可以避免非Sequitor的出现,因为我将您引导到一个关于一般特征的资源:scg.unibe.ch/research/traits
- 这意味着角色提供了类似模板方法模式的机制,而没有继承的包袱。这很有趣。
- @拉古帕塔比,是的。关于这些特质的论文值得一读。他们深入探讨了特性与继承以及混合代码重用的优势。角色/特征是令人惊奇的,可以确切地了解为什么要阅读这些论文,找到一个实现,然后尝试它们。
- 我会注意那些特点。谢谢您。