与面向对象设计相关的构成是什么?

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

  • 所以我可以这么说:"组合就是当我在`Class B`中创建`Class A`的对象时(而不是从'Class A`继承`Class B`)." ? (6认同)

Cyl*_*Cat 43

构成只是构成整体的部分.汽车有轮子,发动机和座椅.继承是一种"是一种"关系.作文是一种"有"关系.

  • 聚合是......关系. (4认同)
  • 聚合可以是简单的组合,或者如果它是类似事物的集合(例如,汽车上的轮子),则可以将其视为集合。汽车可以有四个单独的车轮,并且可以唯一标识,也可以有一组车轮。这取决于使用情况。如果使用集合类,则集合本身就是一个聚合。 (2认同)

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问题.


Iai*_*ard 5

Composition的一个示例是在另一个类中有一个类的实例,而不是从该类继承

页面有一篇很好的文章,解释了为什么人们说“偏爱组成而不是继承”,并举例说明了原因。