Should I use inheritance or composition?
我想把这个短一点。我建造了一个有两个房间的房子,如BedRoom和StudyRoom,这两个房间都来自一个名为Room的基类。BedRoom和StudyRoom有一个相同的父母,叫做House。而且,房子里的任何房间只能通过父母进入其他房间。如果BedRoom必须访问StudyRoom的任何属性,则只能通过House访问(即父级),反之亦然。
| 12
 3
 4
 
 | HouseA ISA HouseHouseA HAS BedRoom and StudyRoom.
 BedRoom ISA Room
 StudyRoom ISA Room
 | 
现在的问题是:假设,我建造了另一个房子(比如说HouseB),这和上面的完全一样,但是有一个变化。我不想要两个单独的房间(即BedRoom和StudyRoom),而想要一个有这两个设施的单人房间(MasterRoom)。为了代码的可重用性,我可以考虑以下设计选项:
| 12
 3
 4
 
 | Option-1:HouseB ISA House
 HouseB HAS MasterRoom
 MasterRoom ISA Room
 | 
在这里,我失去了重用我为HouseA创建的BedRoom和StudyRoom属性的能力。注意,BedRoom和StudyRoom的大部分属性无论如何都需要在MasterRoom中重新实现,从而导致代码重复。
| 12
 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编写代码,我真的很感激任何其他的设计建议。
谢谢
为什么不利用角色来实现这一点:
| 12
 3
 4
 5
 6
 7
 
 | House A has a BedroomBedroom 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
- 这意味着角色提供了类似模板方法模式的机制,而没有继承的包袱。这很有趣。
- @拉古帕塔比,是的。关于这些特质的论文值得一读。他们深入探讨了特性与继承以及混合代码重用的优势。角色/特征是令人惊奇的,可以确切地了解为什么要阅读这些论文,找到一个实现,然后尝试它们。
- 我会注意那些特点。谢谢您。