当查看关联类的图形标记时,我们可能会误认为关联类只是附加到关联的类。
但实际上,关联类既是关联又是类:
UML 2.5.1 / 第11.5.3.2节:关联类是声明具有自己一组特征的关联。关联类既是关联又是类,并保留了两者的静态和动态语义。
因此,在建模语义中,除了符号外,您无法将关联类与相应的关联分开。如果您还不确定,请参阅规范中的下一句话:
关联类描述了一组对象,每个对象都共享由关联类作为类的特征、约束和语义所隐含的规格,并对应于唯一的链接,该链接将关联类作为关联的一种实例化。
(链接是关联的实例,对应于具有“每个成员端点的一个值”的元组)
Message
变成普通类,并与User
关联。同时,也将其与Group
和Chanel
关联。如果必要的话,在这两个关联之间添加一个{xor}
约束,以表示它们是互斥的。
您目前只与“Group”建立了多对多关联,而没有与“Channel”建立关联,这表明存在一些显著的差异,并且更支持第二种情况而不是第一种情况。sends
和message
。由于它们是同一个元素,它们只能有一个名称。 - Axel Scheithauer那么如果您想创建关联类,则不能将类命名为Message,并且关联也不能命名为sends。关联和类都是分类器,因此具有一组共同属性,例如能够拥有特征,具有名称等。这些属性从相同的构造(分类器)中继承,并且不会重复。因此,关联类只有一个名称,并且具有为类和关联定义的特征集。
Note类和Association类都是NamedElement(第47页的“7.8.9 NamedElement [抽象类]”),一个给定名称可以用于多个NamedElement,但是要共存于同一Namespace中,两个NamedElement必须是可区分的。从formal/2017-12-05第49页的“7.8.9.7 Operations”中:
isDistinguishableFrom(n : NamedElement, ns : Namespace) : Boolean
isDistinguishableFrom()查询确定两个NamedElements是否可以在命名空间中逻辑上并存。默认情况下,如果(a)它们具有不是彼此类型的任何类型或(b)它们具有不同的名称,则两个命名元素是可区分的。
然后两个关联Message必须位于不同的命名空间中,因为它们具有相同的名称。
如果你想让消息成为连接用户到组和频道的 UML Association Class 的实例,那么可以将 Message 协会的一端属性连接到一个 UML 类的实例,该类是 Group 和 Channel 的联合体。
要构建联合类,将其作为两个 UML Generalization 实例的一般端,并将其设置为抽象。一个 generalization 的具体端点将是 Group,另一个则是 Channel。为了更清晰明了,将这些 generalization 放入一个 {complete} 的 UML Generalization Set 实例中。
message
,但这样做会很麻烦。而且你的图表中还需要使用Associations。当两个实例之间的链接需要具有属性时(例如,公司-人员可能需要合同开始日期
),使用AssociationClasses是有用的。即使如此,它们通常也可以用普通类和两个关联来替代。 - Axel Scheithauer