oop - 组合与继承

标签 oop inheritance uml composition class-diagram

对于一个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 类的对象。这就是为什么我们说“”关系。

简单的例子(只是为了说明):

enter image description here

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

如果类B“组合”(有一个composition association)C,这意味着B对象可以关联不同的 C 对象在其生命周期中。 Anf 类 C 的对象:

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

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

简单的例子(只是为了说明):

enter image description here

关于oop - 组合与继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62209348/

相关文章:

c++ - 多个文件中的类继承c++

android - 在 Activity 中继承具有上下文的方法

php - 使用 PhpStorm 2016.3 中的用法创建 UML 图

architecture - 基于网络的图表绘制平台

java - API设计中如何引入特殊情况?

java - Java中基于ArrayList的二叉树实现

java - 玩Scala模板,定义对象变量

c# - 学习 "PRACTICAL"OOP 的好资源?

java - 将内核模型传输到 Java 中的输出模型

uml - Visual Studio 2017 - 无法从现有代码生成类图