Dav*_*Dev 64 language-agnostic oop design-patterns composition
我听到(并在这个网站上阅读)很多关于"赞成合成而非继承".
但是什么是Compositon?我从Person:Mammal:Animal的角度理解继承,但我无法在任何地方看到Compostion的定义.有人可以填写我吗?
Fru*_*ner 65
组合是指组合简单类型以制作更复杂的类型.在您的示例中,组合可以是:
Animal:
Skin animalSkin
Organs animalOrgans
Mammal::Animal:
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person::Mammal:
string firstName
string lastName
Run Code Online (Sandbox Code Playgroud)
如果你想完全构图(并摆脱所有继承),它将如下所示:
Animal:
Skin animalSkin
Organs animalOrgans
Mammal:
private Animal _animalRef
Hair/fur mammalFur
warm-blooded-based_cirulation_system heartAndStuff
Person:
private Mammal _mammalRef
string firstName
string lastName
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是类型Mammal并且Person不必符合其先前父级的接口.这可能是一件好事,因为有时对超类的更改会对子类产生严重影响.他们仍然可以通过这些类的私有实例访问这些类的属性和行为,如果他们想要公开这些前超类行为,他们可以简单地将它们包装在公共方法中.
我在这里找到了一个很好的例子:http://www.artima.com/designtechniques/compoinh.html
Cyl*_*Cat 43
构成只是构成整体的部分.汽车有轮子,发动机和座椅.继承是一种"是一种"关系.作文是一种"有"关系.
Car*_*ter 20
有三种方法可以为类提供行为.你可以把这种行为写进班里; 您可以从具有所需行为的类继承; 或者您可以将具有所需行为的类作为字段或成员变量合并到您的类中.最后两个表示代码重用的形式,最后一个 - 组合 - 通常是首选.它实际上并没有为您的类提供所需的行为 - 您仍需要在该字段上调用该方法 - 但它会减少对类设计的约束,从而使测试更容易并且更容易调试代码.继承有其地位,但组成应该是首选.
Zak*_*aki 17
class Engine
{
}
class Automobile
{
}
class Car extends Automobile // car "is a" automobile //inheritance here
{
Engine engine; // car "has a" engine //composition here
}
Run Code Online (Sandbox Code Playgroud)
组合 - 对象的功能由不同类的集合组成.实际上,这意味着保持指向另一个延迟工作的类的指针.
继承 - 对象的功能由它自己的功能和其父类的功能组成.
至于为什么合成比继承更受欢迎,请看一下Circle-ellipse问题.