在2005年的UML 2.0中引入了关联继承。尽管UML可能最常用于面向对象的分析和设计,但它旨在成为一种通用的建模语言。因此,它包括多重继承、属性特化/细化和关联继承等功能,这些功能在编程语言中不一定得到支持。然而,在本体语言(如OWL 2)中,这些概念是自然表达的。
对于其他一些目的,我已经撰写了关于关联继承和等效UML表示的文稿,在此提供给其他人以备有用之需。
关于关联和属性,UML规范定义了三个紧密相关的概念,即“关联专业化”、“子集”和“重新定义”。关联专业化应用于完整关联的级别,而子集和重新定义应用于关联端点和属性的级别。
关联专业化的含义类似于类。也就是说,在图(a)中,关联A2是关联A1的专业化。因此,类C3和C4的实例之间的每个链接必然是类C1和C2的实例之间的链接。然而,类C1和C2的实例之间的每个链接不一定是类C3和C4的实例之间的链接。
由于在图(a)中,
C3/C4
专门化了
C1/C2
,因此可以得出结论,所有
C1
和
C2
之间的关联都将被
C3
和
C4
继承。此外,
C3
和
C4
之间的所有继承关联必然是
C1
和
C2
之间关联的子集。然而,图(a)的含义不仅如此:不仅关联
A1
被
C3
和
C4
继承,它还引入了一个新的关联
A2
。由于
A2
是一个新的关联,没有关联专门化,人们将无法推断出
A1
与
A2
之间的关系。因此,在图(a)中,关联继承的目的是引入一个新的关联
A2
并说明它如何与现有的关联
A1
相关。
在图(b)中,它声明
c4 {subsets c2}
。这意味着由关联端
c4
所表示的实例集是由关联端
c2
所表示的实例集的子集。关联端
c3
和
c1
也是如此。子集与关联特化有所不同,因为子集仅考虑集合成员身份,而关联特化则专门针对确定链接成员身份的特征。
重新定义用于更改功能的定义。例如,在图(c)中,关联端
c4
重新定义了
c2
。重新定义与关联特化有所不同,因为重新定义是针对关联端而不是完整关联定义的。
尽管最初的问题涉及继承层次结构中使用的关联继承,但值得注意的是,在不存在继承层次结构的情况下,也可以使用关联继承。在图(d)中,男人离婚的所有女人都是他结婚的女人的子集。
在图(a)和(d)中,关联是模型的一等公民。因此,它们可以由关联类(
A1/A2
和
MarriedTo/DivorceFrom
)表示,并且在相应的关联类之间存在继承关系,尽管使用关联特化可能更简洁地表明您专门化关联的意图而不是关联类之间的特化。
总之:关联的特化等同于对其端点进行子集化,重定义可以视为子集化的子概念。