什么是与面向对象设计有关的组成?

问题描述 投票:67回答:6

我听说(并在本网站上读到了很多关于“偏爱组成而不是继承”的内容。

但是什么是Compositon?我从Person:Mammal:Animal的角度理解继承,但是我真的看不到任何地方的Compostion的定义。有人可以填写我吗?

oop design-patterns language-agnostic composition
6个回答
65
投票

组成是指将简单类型组合为更复杂的类型。在您的示例中,组成可能是:

Animal:
    Skin animalSkin
    Organs animalOrgans


Mammal::Animal: 
    Hair/fur mammalFur
    warm-blooded-based_cirulation_system heartAndStuff

Person::Mammal: 
    string firstName
    string lastName

如果您想完全合成(并摆脱所有继承),它将看起来像这样:

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不必符合其先前父级的接口。 could是一件好事,因为有时对超类的更改可能会对子类产生严重影响。他们仍然可以通过这些类的私有实例来访问这些类的属性和行为,如果他们想公开这些以前的超类行为,则可以将它们包装在一个公共方法中。

我在这里找到了包含示例的良好链接:http://www.artima.com/designtechniques/compoinh.html


43
投票

组成只是组成整体的部分。汽车具有车轮,发动机和座椅。继承是一个“是”关系。组成是一种“有”的关系。


20
投票

可以通过三种方式使班级有行为。您可以将该行为写到类中。您可以从具有所需行为的类中继承;或者您可以将具有所需行为的类作为字段或成员变量合并到您的类中。后两种代表代码重用的形式,而最后一种通常称为组合。它实际上并没有给您的类所需的行为-您仍然需要在该字段上调用该方法-但它对类的设计施加了更少的约束,并且使测试和调试代码更加容易。继承有它的位置,但是应该首选组合。


17
投票
class Engine
{

}

class Automobile
{

}


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

}

Composition-对象的功能由不同类的集合组成。实际上,这意味着持有一个指向要延迟工作的另一个类的指针。

继承-对象的功能由其自身的功能以及其父类的功能组成。

关于为什么首选组合而不是继承,请看Circle-ellipse problem


5
投票

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

[This页面上有一篇不错的文章,解释了为什么人们说“赞成继承而不是继承”以及其中的一些示例。


0
投票

组成

© www.soinside.com 2019 - 2024. All rights reserved.