对于一个UML类图,如果一个类A和另一个类B有组合关系,是不是像继承一样工作?我知道没有类 B 就不能存在类 A,但是类 A 是否继承了类 B 的属性和方法?
最佳答案
组合优于继承
在 OO 设计中,一个常见的建议是更喜欢 composition over inheritance .这可能会误导人们认为这两个不同概念之间存在联系:
- 继承是关于类之间的关系。
- 组合是关于类对象之间的关系。
更具误导性:一般 OO 文献中使用的“组合”一般对应于 simple UML association并且不应被理解为与 UML“组合”一样具有限制性。
继承是关于泛化和特化
如果类D
继承自B
,则意味着D
specialises a more general concept B
:
- 它具有
B
的所有属性和操作(无需在图中重复), - 它可以有与
B
无关的额外属性和操作,并且 - 它可以以不同的方式执行
B
的一些操作。 D
类的任何对象在其整个生命周期内也是B
类的对象。这就是为什么我们说“是”关系。
简单的例子(只是为了说明):
组合是关于非常不同类的对象的关联
如果类B
“组合”(有一个composition association)C
,这意味着B
对象可以关联不同的 C
对象在其生命周期中。 Anf 类 C
的对象:
- 始终属于拥有它的
B
对象。这就是为什么我们有时会说“有一个”关系; - 将无法生存其拥有的
B
对象。
警告:UML 组合是关于排他性所有权的。在 OO 文献中,术语“组合”通常指没有任何所有权甚至排他性的较弱的关联。
简单的例子(只是为了说明):
关于oop - 组合与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62209348/