与面向对象devise有关的构成是什么?

我听到(并在这个网站上阅读)很多关于“偏爱构成而不是inheritance”。

但Compositon是什么? 我从人的angular度理解inheritance:哺乳动物:动物,但是我无法在任何地方真正看到“组合”的定义。有人可以填补我吗?

构图是指将简单的types组合起来,使其更复杂。 在你的例子中,组合可以是:

Animal: Skin animalSkin Organs animalOrgans Mammal::Animal: Hair/fur mammalFur warm-blooded-based_cirulation_system heartAndStuff Person::Mammal: string firstName string lastName 

如果你想完全组合(并且除去所有的inheritance),它将如下所示:

 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 

这种方法的好处是, MammalPerson的types不必符合他们以前的父母的界面。 这可能是一件好事,因为有时对超类的改变会对子类产生严重的影响。 他们仍然可以通过这些类的私有实例访问这些类的属性和行为,如果他们想要公开这些前一类超类的行为,他们可以简单地用公开的方法来包装它们。

我在这里find了一个很好的例子: http : //www.artima.com/designtechniques/compoinh.html

构成只是组成整体的部分。 一辆车有轮子,引擎和座位。 inheritance是一个“是”的关系。 构图是一个“有”的关系。

有三种方法可以为一个class级提供行为。 你可以把这种行为写入课堂; 你可以inheritance一个具有所需行为的类; 或者你也可以将一个具有所需行为的类作为一个字段或成员variablesjoin到你的类中。 最后两个表示代码重用的forms,最后一个 – 组成 – 通常是首选。 它实际上并没有给你的类想要的行为 – 你仍然需要在字段上调用方法 – 但是它减less了对类devise的约束,并且使得testing更容易,更容易debugging代码。 inheritance有其自己的位置,但组成应该是首选。

 class Engine { } class Automobile { } class Car extends Automobile // car "is a" automobile //inheritance here { Engine engine; // car "has a" engine //composition here } 

构图 – 对象的function由不同类别的聚合构成。 实际上,这意味着持有一个指向另一个工作类的类的指针。

inheritance – 对象的function是由它自己的function加上其父类的function组成的。

至于为什么组合优于inheritance,请看一下Circle-ellipse问题 。

Composition的一个例子就是在另一个类中有一个类的实例,而不是inheritance它

这个网页有一篇很好的文章解释了为什么人们说“支持构图而不是inheritance”和一些例子。