组合与继承
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 <*>--- B
或 A <*>---> B
而不是相反(B <*>--- A
或 B <*>---> 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 <*>--- B
或A <*>---> 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
,则表示D
specialises 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" 通常指没有任何所有权甚至排他性的较弱的关联。
天真的例子(仅供说明):
对于一个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 <*>--- B
或 A <*>---> B
而不是相反(B <*>--- A
或 B <*>---> 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 <*>--- B
或A <*>---> 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
,则表示D
specialises a more general conceptB
:
- 具有
B
的所有属性和操作(无需在图中重复), - 它可以具有与
B
和 无关的其他属性和操作
- 它可以以不同的方式执行
B
的一些操作。 - class
D
的任何对象在其整个生命周期内也是 classB
的对象。这就是为什么我们说“是”的关系。
天真的例子(仅供说明):
组合是关于非常不同的对象的关联 classes
如果classB
"composes"(有一个composition associationwith)C
,表示可以关联B
对象在其生命周期中使用不同的 C
个对象。 class C
的对象:
- 始终属于拥有它的
B
对象。这就是为什么我们有时会说“有”的关系; - 其拥有的
B
对象将无法存活。
注意:UML 组合是关于排他性所有权的。在 OO 文献中,术语 "composition" 通常指没有任何所有权甚至排他性的较弱的关联。
天真的例子(仅供说明):