【发布时间】:2020-01-24 13:30:37
【问题描述】:
看到所有关于组合/聚合/关联的答案很奇怪。 谁/这些概念的来源是什么?
最后是我可爱的 stackoverflow(至少我很高兴答案没有被标记为已验证)
What is the difference between association, aggregation and composition?
What is the difference between aggregation, composition and dependency?
有一本很棒的书“设计模式” GoF
它描述了在面向对象系统中重用功能的两种最常见的技术: 1)类继承(is-a) 2)对象组合(has-a)
“对象组合是类继承的一种替代方式。在这里,通过组合或组合对象来获得新功能以获得更复杂的功能。”
与“关联”不同,“组合”是一个非常描述性的术语,用于表达对象之间的关系。 为什么上面所有这些来源都以错误的方式使用术语“组合”?!
让我们走得更远。
对象可以通过两种方式组合:
1) 聚合
2) 熟人
“考虑对象聚合和熟人之间的区别,以及它们在编译和运行时表现出的差异。聚合意味着一个对象拥有或负责另一个对象。通常我们所说的对象具有或属于另一个对象。聚合意味着聚合对象及其所有者具有相同的生命周期。"
聚合对象及其所有者具有相同的生命周期!!!
“相识意味着一个对象只知道另一个对象。相识有时被称为“关联”或“使用”关系。相识的对象可以请求彼此的操作,但彼此不负责。相识是比聚合更弱的关系,表明对象之间的耦合要松散得多。”
“聚合和相识很容易混淆,因为它们的实现方式往往相同。在Smalltalk中,所有变量都是对其他对象的引用。在编程语言中,聚合和相识没有区别。在C++中,聚合可以通过定义成员变量来实现,这些成员变量是真实的实例,但更常见的是将它们定义为实例的指针或引用。相识也是通过指针和引用来实现的。”
伙计们,请帮我弄清楚这里发生了什么......
【问题讨论】:
-
对象关系的许多概念都来自 UML。在实践中,我发现很少需要区分它们。关于高度评价的错误信息,欢迎使用 StackOverflow。
-
顺便说一句,这篇文章读起来更像是一个咆哮而不是一个问题。也许您可以准确指出您正在寻找什么样的答案。
-
您还应该尝试引用您提供的网站的相关部分,以便您的帖子更易于阅读。
标签: oop design-patterns aggregation composition