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

How to model a covariant association-class in UML?

简而言之

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

问题的逐步解释

我在 UML class 图中有一个 PersonContract 之间的多对多关联。一个人可以参与多个合同,反之一个合同也可以涉及几个人。每个相关人员都参与了合同中的一个角色。一个人甚至可以多次参与同一合同中的不同角色:

Contract 专业有很多种。我们来看看 CompanyFoundationContract,其中有几个人决定创建一家公司。 Person也可以特化。这里我使用了一种特殊的人,叫做Founder。在实践中,我更喜欢组合而不是继承,而创始人将是一个装饰者。但为了简单起见,我稍后会省略这个细节:

从 UML 专业化,我知道 FounderCompanyFoundationContract 继承了多对多关系。但在与我的法律实践用户讨论后,很快就会发现 CompanyFoundationContract 中的 FounderRole 也需要专门化,例如考虑股份在公司举行。在我的 class 图表中模拟这种协方差似乎很简单:

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

由于关联-class ShareHolderRoleRole 关联-class 的特化,我希望弄清楚它是同一个关联ContractPerson 之间以及 CompanyFoundationContractFounder 之间。

但是,我担心我错过了什么,严格解释 UML 意味着有两个不同的冗余关联。我应该如何准确地模拟只有一个关联但协变关联的事实 - class?

(您使用 Founders 的图表中有错字)

I'd expect to clear that it's one and the same association between Contract and Person and between CompanyFoundationContract and Founder

不适合我,否则这意味着不可能将该关联作为附加关联,但当然这是可能的

如果您想明确说明,请添加关联结束的名称并使用相同的一对名称:

你也可以明确地说每个关联端重新定义另一个,允许使用不同的名称:

或者当然你可以像我在 'source' 中那样做:

其中蓝色约束涉及关系-class 而不仅仅是对应的 classes,并且绿色约束不是强制性的,因为它们可以从蓝色约束中推导出来

“一个人甚至可以多次参与同一合同中的不同角色” - 角色不应该是二元的,而是人[之间的三元关联=16=]、合同角色类型

专门的关联 class 不限于仅连接重新定义的属性。所以,完全有可能,这个关联 class 连接了 founderfoundationContract,而这些属性与 personcontract 无关(除了他们的类型是专业)。但是,如果您重新定义它们,那么这些新属性(甚至可以具有相同的名称)将取代旧属性,从而使创始人不可能拥有非基金会合同。

现在,基础合同仍然是合同。因此,一个人所涉及的合同清单应该包含它们。这可以通过子集化来实现。只需定义 foundationContract {subsets contract}founder {subsets person}。我想,这才是你真正想要的。

由于属性是每个默认集合,而“集合”意味着它们不包含重复项,因此同一个人不可能在同一合同中扮演多个角色。如果您希望这成为可能,则必须为属性设置 属性 {nonunique}

初步评论: 首先,我想感谢 Bruno 和 Axel 各自的回答,这让我走上了正确的道路。然而,根据他们的指示进一步挖掘,我偶然发现了一个更简单的解决方案和支持参考。因为它很有用,并且按照 Bruno 的建议,我最终决定 post 它作为答案。

简单的关联可以特化吗?

在我的问题中,我考虑了关联 class 的情况,因为我认为只有 classes 可以被专门化。但其实简单的联想也是可以泛化的

首先,根据 UML 2.5,关联本身已经是 classisifier:

Section 11.5.1: An Association classifies a set of tuples representing links between typed instances. An AssociationClass is both an Association and a Class.

一个 classifier 可以特化:

Section 9.2.3.2: Generalizations define generalization/specialization relationships between Classifiers.

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

协会专业化是什么意思?

关联专业化的语义定义明确(我的亮点:

Section 11.5.3.1 (p.198): (...) In the case of Associations, specialization means that a link classified by the specializing Association is also classified by the specialized Association. Semantically this implies that sets calculated by eliminating duplicates from the collections representing the ends of the specializing Association are subsets of the corresponding sets calculated by eliminating duplicates from collections representing the ends of the specialized Association; this fact of subsetting may or may not be explicitly declared in a model.

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

那么关联 classes 呢?

协会class既是协会又是class。 UML 规范阐明两者都是 classifiers 并且属性 元模型的不重复。所以它是一回事。专业化同时适用于两者:

Section 11.5.3.2:(...) the specialization and refinement rules defined for Class and Association are also applicable to AssociationClass.

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

结论

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

请注意,这里有一个细微的差别:generalization/specialization 是关于关联本身的,而子集是关于关联结束的。

其他见解: