oop - 组合与继承
问题描述
对于 UML 类图,如果一个类 A 与另一个类 B 有组合关系,它是否像继承一样工作?我知道A类没有B类就不能存在,但是A类是否继承了B类的属性和方法?
解决方案
组合优于继承
在 OO 设计中,一个常见的建议是更喜欢组合而不是继承。这可能会误导人们认为这两个不同的概念之间存在关系:
- 继承是关于类之间的关系。
- 组合是关于类对象之间的关系。
更容易产生误导:一般 OO 文献中使用的“组合”通常对应于简单的 UML 关联,不应理解为与 UML“组合”一样具有限制性。
继承是关于泛化和专业化
如果 classD
继承自 B
,则意味着D
专门化了一个更一般的概念 B
:
- 它具有的所有属性和操作
B
(无需在图中重复), - 它可以具有与 不相关的其他属性和操作
B
,并且 - 它可以执行一些
B
不同的操作。 - 任何类的对象在其整个生命周期
D
内也是类的对象。B
这就是为什么我们说“是”关系。
天真的示例(仅用于说明):
组合是关于非常不同类的对象的关联
如果类B
“组合”(与组合有关联)C
,则意味着该B
对象可以C
在其生命周期内与不同的对象相关联。Anf 类的对象C
:
- 始终属于
B
拥有它的对象。这就是为什么我们有时会说“有”的关系; - 将无法生存其拥有的
B
对象。
警告:UML 组合是关于独占所有权。在 OO 文献中,术语“组合”通常是指没有任何所有权甚至排他性的较弱关联。
天真的示例(仅用于说明):
推荐阅读
- php - 在服务器中使用锚按钮的问题(cent os)
- android - Xamarin.Android:密钥侦听器不起作用
- powershell - 尝试从 CSV 错误“Move-CsUser:无法绑定参数'Identity'。无法转换值...”中的选择中移动用户
- ocaml - 将 ocamlyacc 与 sedlex 一起使用
- python - 如何根据列表项打破列表并创建相关字符串
- java - 将 Excel 文件 (xlsx) 转换为 Json
- c++ - 为什么我从来没有机会输入我的输入?
- composer-php - Composer 更新删除包
- node.js - Find Query Monogodb take too long
- javascript - 如何使用来自另一个文件的道具做出反应?