组合与继承

Composition vs. Inheritance

对于一个UML Class图,如果一个class A与另一个class B有组合关系,它是否像继承一样工作?我知道 class A 不能没有 class b 但 class A 是否继承了 class B 的属性和方法?

继承和组合是两个不同的概念。如果它们相同,则不需要使用不同的符号。

  • 组合是关于对象的生命周期。组合元素将在所有者被销毁的那一刻被销毁。但是每个实例都可以(并且很可能会)是与组合对象完全不同的东西。众所周知的例子是汽车:当你粉碎一辆汽车时,它的组合车轮也会被粉碎。只有事先将它们分离,它们才能继续存在。

  • 继承意味着实例将在父 class 中定义自己的操作和属性。这适用于每个实例。没有很好的继承真实世界的例子(基因工作不同,继承的资产在这里也无济于事)。

if a class A has a composition relationship with another class B

假设您的意思是 A <*>--- BA <*>---> B 而不是相反(B <*>--- AB <*>---> A),因为这在您的问题中不是很清楚。

class A cannot exist without class b

这不是关于 ,而是关于这些 类 和 个实例 ]B 可以拥有独立于该组合的实例,因此有限的生命并不适用于 B.

的所有实例

does it work like inheritance? does class A inherit the attributes and methods from class B ?

没有

A继承B表示A是一个 B,绝对不是A <*>--- BA <*>---> B或相反的情况。

那么独立于操作的可见性,你不能将 A 的操作应用于 B 的实例,反之亦然,除了当然,如果你也有比组合更多的继承。

关于 B 的属性取决于组合的实现方式,它们可能是 A 的相应实例的一部分,例如在 C++ 中不使用指针进行组合就是这种情况。但是无论如何,这并不意味着 B 的这些属性是 A 的属性,要访问它们,需要首先访问 [=] 的实例34=]B 通过组合,并且还假定 A 的实例有权直接访问 B[=57= 的这些属性],所以它们通常是 public

请注意,您还可以拥有 A<*>--->B<*>--->A 等,幸运的是,这确实意味着 A 继承了 B B继承了A这是不可能的

组合优于继承

在 OO 设计中,一个常见的建议是更喜欢 composition over inheritance。这可能会误导人们认为这两个不同概念之间存在联系:

  • 继承是关于 class 之间的关系。
  • 组合是关于 classes 的对象之间的关系。

甚至更具误导性:一般 OO 文献中使用的 "composition" 通常对应于 simple UML association,不应像 UML "composition" 那样被理解为限制性的。

继承就是泛化和特化

如果classD继承自B,则表示Dspecialises a more general conceptB:

  • 具有B的所有属性和操作(无需在图中重复),
  • 它可以具有与 B
  • 无关的其他属性和操作
  • 它可以以不同的方式执行B的一些操作。
  • class D 的任何对象在其整个生命周期内也是 class B 的对象。这就是为什么我们说“”的关系。

天真的例子(仅供说明):

组合是关于非常不同的对象的关联 classes

如果classB"composes"(有一个composition associationwith)C,表示可以关联B对象在其生命周期中使用不同的 C 个对象。 class C 的对象:

  • 始终属于拥有它的 B 对象。这就是为什么我们有时会说“”的关系;
  • 其拥有的 B 对象将无法存活。

注意:UML 组合是关于排他性所有权的。在 OO 文献中,术语 "composition" 通常指没有任何所有权甚至排他性的较弱的关联。

天真的例子(仅供说明):