组成与继承

问题描述 投票:1回答:3

对于UML类图,如果类A与另一个类B具有组成关系,它是否像继承一样工作?我知道没有类b就不能存在类A,但是类A是否继承了类B的属性和方法?

oop inheritance uml composition class-diagram
3个回答
0
投票

继承和构成是两个不同的概念。如果它们相同,则无需使用不同的符号。

  • 组成是关于对象的生存期的。所有者被销毁后,组成的元素将被销毁。但是每个实例都可以(并且很可能会)与组成对象完全不同。众所周知的例子是汽车:当您将汽车切碎时,其组成的车轮也会被切碎。只有事先分离它们,它们才能继续存在。

  • 继承意味着实例将具有在父类中自行定义的操作和属性。这适用于每个实例。没有很好的继承实例(基因的工作原理不同,继承的资产在这里也无济于事)。


1
投票

继承的构成

在OO设计中,通常的建议是选择composition over inheritance。这可能会误以为这两个不同的概念之间存在联系:

  • 继承是关于类之间的关系的。
  • 组成是关于类的对象之间的关系。
  • 甚至更具误导性:一般OO文献中使用的“组合物”通常对应于simple UML association,不应理解为与UML“组合物”一样的限制性。

继承涉及泛化和专业化

如果类D继承自B,则表示Dspecialises a more general conceptB

  • 它具有B的所有属性和操作(无需在图中重复它们,
  • 它可以具有与B不相关的其他属性和操作,并且
  • 它可以不同地执行B的某些操作。
  • D类的任何对象在其整个生命周期内也是B类的对象。这就是为什么我们说“ 是[]]
  • ”关系。

    朴素的例子(仅用于说明):

    enter image description here

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

如果类B“组成”(具有composition associationC),则表示B对象可以在其生命周期内与不同的C对象关联。 Anf类C的对象:

  • 始终属于拥有它的B对象。这就是为什么我们有时会说“ [has a”关系的原因;
  • 将无法在其拥有的B对象中生存。
  • 警告:UML组成是关于专有所有权的。在OO文献中,术语“组合”通常是指较弱的关联,没有任何所有权,甚至没有排他性。

朴素的例子(仅用于说明):

enter image description here

如果A类与另一个B具有组成关系,则>

假设您的意思是A <*>--- BA <*>---> B而不是相反的数字[B <*>--- AB <*>---> A,因为在您的问题中这不是很清楚。

没有类b的A类不能存在

不是关于classes

,而是关于这些类的instances,并且B可以具有独立于该组成的实例,因此有限寿命并不限于B]的所有实例。 >。

它像继承一样起作用吗?类A继承了类B的属性和方法吗?

编号

A

继承B表示A 是a B,绝对不是A <*>--- BA <*>---> B或相反的情况。] >

然后,与操作的可见性无关,您不能将A的操作应用于B的实例,也不能将其应用于相反的实例,当然,如果您的继承也超过组成。

关于B的属性,具体取决于实现组合的方式,有可能它们是A

的相应实例的一部分,这种情况在C ++中不使用指针组成。但是无论如何,这并不意味着B的这些属性是A的属性,要访问它们,需要通过构成首先访问B的实例,并且还假设A的实例有权直接访问B的这些属性,因此它们通常是public

注意,您也可以有A<*>--->B<*>--->A等,所幸这确实暗示A继承B,而B继承A这是不可能的


-1
投票

如果A类与另一个B具有组成关系,则>

© www.soinside.com 2019 - 2024. All rights reserved.