如何在 UML 中建模协变关联类?

2024-04-05

In short

我想对两个类之间的协变关联进行建模,每个类都可以专门化。我需要展示相关关联类的专业化。但我想避免我的模型可能意味着存在冗余关联(即泛化之间的关联和专业化之间的关联)。

问题的逐步解释

我在 UML 类图中有一个多对多关联Person and a Contract。一个人可以涉及多个合同,反之,一个合同可以涉及多个人。每个相关人员都在合同中扮演一个角色。一个人甚至可以多次参与同一份合同中的不同角色:

There are many kind of Contract specializations. Let's take a look at CompanyFoundationContract, where several persons decide to create a company. Person can also be specialized. Here I use a special kind of person called Founder. In practice, I prefer composition over inheritance, and the founder would be a decorator. But I'll omit this detail later for the sake of simplification:
enter image description here

从 UML 专业化来看,我知道Founder and CompanyFoundationContract继承多对多关系。但在与我的法律实践用户讨论后,很快就发现Role of a Founder in a CompanyFoundationContract还需要专门化,例如考虑到公司持有的股份。在我的类图中对这种协方差进行建模似乎很简单:

乍一看,这种模型可以代表此类合同的法律复杂性:显然,非创始人的其他人可以以正常角色参与合同(例如注册公司的公证人或律师)。

自协会级以来ShareHolderRole是一个专业化Role关联类,我希望澄清它是同一个关联Contract and Person和之间CompanyFoundationContract and Founder.

然而,我担心我错过了一些东西,并且严格解释 UML 将意味着有两个不同且冗余的关联。我该如何准确地建模这样一个事实:只有一个关联,但有一个协变关联类?


初步评论:首先,我想感谢布鲁诺和阿克塞尔各自的答案,这让我走上了正轨。尽管如此,根据他们的指示进一步挖掘,我偶然发现了一个更简单的解决方案和支持参考。因为它很有用,并且按照布鲁诺的建议,我最终决定将其作为答案发布。

简单的关联可以特化吗?

在我的问题中,我考虑了关联类的情况,因为我认为只有类可以专门化。但事实上,简单的关联也是可以推广的。

首先,根据 UML 2.5,关联本身已经是一个分类器:

第 11.5.1 节:关联对一组表示之间链接的元组进行分类 键入的实例。 AssociationClass 既是关联又是类。

分类器可以专门化:

第 9.2.3.2 节:泛化定义了分类器之间的泛化/专业化关系。

符号如下(我不告诉你规格细节,我必须承认,如果我在两周前看到这个,我会声称“胡说八道”):

协会专业化是什么意思?

关联专业化的语义定义良好(我的重点是:

第11.5.3.1节(p.198): (...) 就协会而言,专业化意味着按专业化分类的链接 协会也是按专门协会分类的。从语义上讲,这意味着 通过从代表末端的集合中消除重复项来计算的集合 专门关联是通过消除计算出的相应集合的子集 代表专业协会目的的收藏品的副本;这 子集化的事实可能会也可能不会在模型中显式声明.

因此,在不告诉任何有关关联结束的情况下,专业化意味着专业化关联是一般关联的子集。显式子集化是可选的:

那么关联课程呢?

关联类既是关联又是类。 UML 规范阐明两者都是分类器并且属性 元模型的内容不重复。所以这是一回事。该专业同时适用于两者:

第 11.5.3.2 节:(...)为Class和Association定义的专业化和细化规则也适用于AssociationClass。

重要提示:一个关联可以泛化另一个关联,一个关联类可以泛化一个关联类,但是“关联类不能 是协会或类的概括”),而我们通常理解的方式是无效的:

结论

当严格考虑 UML 规范时,我的图表(关联类之间的简单专业化)似乎是正确的, 明确并表达意图的语义。亚历克斯的回答建议明确声明隐含的子集:这是有效的,但它是 不需要。

请注意,存在细微的差别:泛化/专门化与关联本身有关,而子集则与关联结束有关。

附加见解:

  • 对关联的重定义、子集化和特化的语义进行了详细分析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 UML 中建模协变关联类? 的相关文章

随机推荐