组合是否可以双向进行,使得两个类都互相感知?
如果不行的话,组合的默认方向是什么?
组合是否可以双向进行,使得两个类都互相感知?
如果不行的话,组合的默认方向是什么?
箭头A->B仅表示B可以通过某种简单的方式从A到达。如果A包含B的组成部分,则意味着
复合对象对于组成的对象(部件)的存在和存储负有责任。
(引自OMG统一建模语言TM(OMG UML)- p.109)
是的。这很正常。
例如,如果您已决定在某些功能中销毁B,则必须从A到达并从那里销毁它。因此,组合关系通常具有双向可导性。请注意,根据当前和即将推出的UML标准,双向可导性显示为没有两侧箭头的线。双向箭头已弃用。这就是您不经常看到它的原因。
不行,当然这种关联不能是相互的,因为B只能在A中创建,同时A也只能在B中创建,这是不可能的。
有趣的是,共享聚合
(空菱形)也不能相互,但这里的限制并不固有,它只是被UML标准禁止而已。
来自https://www.lucidchart.com/pages/uml/class-diagram:
双向关联是两个类之间的默认关联,由两个类之间的直线表示。两个类都知道彼此以及彼此之间的关系。在上面的示例中,Car类和RoadTrip类相互关联。在线的一端,汽车承担“assignedCar”的关联,其多重性值为0..1,这意味着当RoadTrip实例存在时,它可以与一个或没有汽车实例相关联。在这种情况下,需要一个具有0..*多重性值的单独的Caravan类来演示RoadTrip可以有多个Cars实例相关联。由于一个Car实例可能有多个“getRoadTrip”关联--换句话说,一辆汽车可以进行多次公路旅行--因此将多重性值设置为0..*
过去我和Gangnus有一样的看法:
那么,组合关系可以具有双向导航性吗?
但最近的一些讨论后,我更详细地研究了UML规范。简单来说,这个说法是不正确的(仅部分正确)。让我们看看UML 2.5规范。在第110页中指出:
有时,属性用于模拟一种情况,其中一个实例用于将一组实例分组在一起;这称为聚合。为了表示这种情况,属性具有聚合属性,类型为AggregationKind;代表整个组的实例由属性的所有者分类,代表分组个体的实例由属性的类型分类。AggregationKind是一个枚举类型,具有以下文字值:A
组成 B
,那么当它自身被销毁时,它将负责删除 B
。反之亦然,B
将负责 A
的销毁。因此,如果你在两个方向上都有引用(即两侧都有菱形),那么你就需要负责删除另一侧的对象。当然,这仅在两者中的一个保持对另一个的引用时才有效。如果两者都有引用,则不可能有定向的责任(因为它是循环的)。