在UML类图中,组合关系是否可以是双向的?

10

组合是否可以双向进行,使得两个类都互相感知?

如果不行的话,组合的默认方向是什么?


1
这个问题非常简单,但我还没有在这里看到过。+1。 - Gangnus
4个回答

6

您应该区分可导航性和聚合。箭头和菱形。

箭头A->B仅表示B可以通过某种简单的方式从A到达。如果A包含B的组成部分,则意味着

复合对象对于组成的对象(部件)的存在和存储负有责任。

(引自OMG统一建模语言TM(OMG UML)- p.109)

那么,组合关系是否可以具有双向可导性?

是的。这很正常。

例如,如果您已决定在某些功能中销毁B,则必须从A到达并从那里销毁它。因此,组合关系通常具有双向可导性。请注意,根据当前和即将推出的UML标准,双向可导性显示为没有两侧箭头的线。双向箭头已弃用。这就是您不经常看到它的原因。

组合本身是否可以是双向的?我们能否在关联的两侧看到黑色菱形?

不行,当然这种关联不能是相互的,因为B只能在A中创建,同时A也只能在B中创建,这是不可能的。

有趣的是,共享聚合(空菱形)也不能相互,但这里的限制并不固有,它只是被UML标准禁止而已。


“双向箭头已被弃用”来源在哪里?因为OMG UML 2.5(2015年6月)第203页仍然说:“顶部的AB对显示具有两个可导航端点的二元关联”,该图的线条两端都有箭头。 - Martin Schneider
它并不是被禁止的,只是不再流行。看看他们自己的图表-没有双向箭头。把它当作一种使用快捷方式,并且如果你喜欢,可以使用双向箭头。 - Gangnus
@Jan 不是,组合是聚合的一个子集。(在UML中) - Gangnus
好的,congregation是聚合的另一个词!但是在UML中,congregation不是一个定义过的术语。 - Jan
@qwerty_so 我不知道。但非常感谢您的编辑。 - Gangnus
显示剩余11条评论

5

是的,组合不会对关联的导航性添加约束。

有关协会、组合和聚合之间差异的更多信息,请参见此处:UML组合与聚合与关联


1

来自https://www.lucidchart.com/pages/uml/class-diagram

双向关联是两个类之间的默认关联,由两个类之间的直线表示。两个类都知道彼此以及彼此之间的关系。在上面的示例中,Car类和RoadTrip类相互关联。在线的一端,汽车承担“assignedCar”的关联,其多重性值为0..1,这意味着当RoadTrip实例存在时,它可以与一个或没有汽车实例相关联。在这种情况下,需要一个具有0..*多重性值的单独的Caravan类来演示RoadTrip可以有多个Cars实例相关联。由于一个Car实例可能有多个“getRoadTrip”关联--换句话说,一辆汽车可以进行多次公路旅行--因此将多重性值设置为0..*


1

过去我和Gangnus有一样的看法:

那么,组合关系可以具有双向导航性吗?

但最近的一些讨论后,我更详细地研究了UML规范。简单来说,这个说法是不正确的(仅部分正确)。让我们看看UML 2.5规范。在第110页中指出:

有时,属性用于模拟一种情况,其中一个实例用于将一组实例分组在一起;这称为聚合。为了表示这种情况,属性具有聚合属性,类型为AggregationKind;代表整个组的实例由属性的所有者分类,代表分组个体的实例由属性的类型分类。AggregationKind是一个枚举类型,具有以下文字值:
[省略共享聚合]
组合:表示属性被组合地聚合,即组合对象对编写对象的存在和存储负责(请参见11.2.3中部分的定义)。
组合聚合是聚合的强形式,要求部分对象最多同时包含在一个组合对象中。如果删除组合对象,则与其相关的所有对象实例都将被删除。
请注意上面文本中对对象/实例的强调。所以,UML只谈论职责。如果 A 组成 B,那么当它自身被销毁时,它将负责删除 B。反之亦然,B 将负责 A 的销毁。因此,如果你在两个方向上都有引用(即两侧都有菱形),那么你就需要负责删除另一侧的对象。当然,这仅在两者中的一个保持对另一个的引用时才有效。如果两者都有引用,则不可能有定向的责任(因为它是循环的)。
我仍然认为在两侧都进行组合聚合不是一个好主意。但根据规范,这是可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接