【发布时间】:2020-06-05 06:25:42
【问题描述】:
对于一个UML类图,如果一个类A与另一个类B有组合关系,它的工作方式和继承一样吗?我知道A类没有B类就不能存在,但是A类继承了B类的属性和方法吗?
【问题讨论】:
标签: oop inheritance uml composition class-diagram
对于一个UML类图,如果一个类A与另一个类B有组合关系,它的工作方式和继承一样吗?我知道A类没有B类就不能存在,但是A类继承了B类的属性和方法吗?
【问题讨论】:
标签: oop inheritance uml composition class-diagram
在 OO 设计中,一个常见的建议是首选composition over inheritance。这可能会误导人们认为这两个不同的概念之间存在关系:
更具有误导性:一般 OO 文献中使用的“组合”通常对应于 simple UML association,不应理解为与 UML“组合”一样具有限制性。
如果类D继承自B,则表示Dspecialises a more general conceptB:
B的所有属性和操作(图中无需重复),B 无关的其他属性和操作,并且B的一些操作。 D 类的任何对象在其整个生命周期内也是B 类的对象。这就是我们说“是”关系的原因。 朴素的例子(只是为了说明):
如果B 类“组合”(具有composition association 和)C,则意味着B 对象可以在其生命周期内与不同的C 对象相关联。 Anf 类 C 的对象:
B 对象。这就是为什么我们有时会说“有”的关系; B 对象中存活。 警告:UML 组合是关于独占所有权的。在 OO 文献中,术语“组合”通常是指没有任何所有权甚至排他性的较弱关联。
朴素的例子(只是为了说明):
【讨论】:
继承和组合是两个不同的概念。如果它们相同,则不需要使用不同的符号。
组合是关于对象的生命周期的。组合元素将在所有者被销毁的那一刻被销毁。但是每个实例都可以(并且可能会)与组成对象完全不同。众所周知的例子是一辆汽车:当你粉碎一辆汽车时,它的组合轮子也会被粉碎。只有事先将它们分离,它们才能继续存在。
继承意味着实例将在其父类中定义自己的操作和属性。这适用于每个单独的实例。没有很好的真实世界继承示例(基因的工作方式不同,继承的资产在这里也无济于事)。
【讨论】:
如果一个类 A 与另一个类 B 有组合关系
假设您的意思是 A <*>--- B 或 A <*>---> B 而不是相反的(B <*>--- A 或 B <*>---> A),因为这在您的问题中不是很清楚。
没有b类就不能存在A类
这不是关于类,而是关于这些类的实例,并且B可以有独立于该组合的实例,因此有限的生命并不适用于所有 B 的实例。
它像继承一样工作吗? A类是否继承了B类的属性和方法?
没有。
A继承B的意思是A 是一个 B,这绝对是不是A <*>--- B 或A <*>---> B 或相反的情况。
那么独立于操作的可见性,您不能将 A 的操作应用于 B 的实例,也不能反过来,当然,如果您也有继承比作曲还要多。
关于 B 的属性取决于组合的实现方式,它们可能是 A 的相应实例的一部分,例如C++ 不使用组合的指针。但是无论如何这并不意味着 B 的这些属性是 A 的属性,要访问它们需要首先访问 B 的实例尽管组合,并且还假设 A 的实例有权直接访问 B 的这些属性,因此它们通常是 public。
请注意,您也可以拥有A<*>--->B<*>--->A 等,幸运的是,这确实意味着 A 继承了 B 并且 B 继承了 A em>这是不可能的
【讨论】: