如何保证 class 专业化是一致的

How to guarantee that class specializations are consistent

我有两个摘要类,代表一个作文:

我对这两个 class 进行了具体化,例如:

国家摘要class作为人物列表作为属性:peopleList:People

我如何保证 France class peopleList 属性将仅由 FrenchGuy 填充,以及 ItalyItalianGuy,并使其保持一致 ?

我的设计方式是反模式吗?

提前感谢您的回答

基本上您可以使用 Generalization Sets 来做到这一点。这将确保来自 ItalyItalian Guy 的概括(您有一个 male-only 国家?)是相关的,因此您将只有 "right" 人口。

我将用一个不会混淆 "is a kind of" 和 "is an instance of" 的例子来回答这个问题。 (有关更多详细信息,请参阅我对原始问题的评论。)

你确实可以保证特定的专业只与某些其他专业相关联。您可以使用 UML 关联专业化和 属性 重定义来做到这一点。

我将向您介绍此 UML 图告诉我们的内容:

  • Insurance PolicyInsurable Thing 之间有一个未命名的关联,它有两个属性:insuresinsured by.它告诉我们,一般来说,每个Insurance Policy保险一个或多个Insurable Things,每个Insurable Thing可能保险 任意数量的 Insurance Policies
  • 一个 Insurance Policy 有两个不相交的²特化:Health Insurance PolicyCar Insurance Policy
  • Insurable Thing 有两个不相交的特化:CarPerson
  • 顶部的未命名关联有两个具有更具体 属性 约束的专门关联:
    • Car Insurance PolicyCar 之间的关联具有重新定义(即收紧)它们允许的类型的属性。
    • Health Insurance PolicyPerson 之间的关联具有 重新定义 (即收紧)它们允许的类型的属性。

专业协会和重新定义正在这里做所有的工作。如果愿意,您可以进一步收紧多重性,甚至更改 属性 名称³。


¹ 请注意,UML 最近采用了 "dot notation",这使得关联末端缺少点变得不明确。前点符号,可导航的 属性 由关联另一端的 class 拥有。 Post 点符号,可导航的 属性 归协会所有——除了很少有工具支持它,而那些支持它的工具,如 MagicDraw,会关闭点 默认在项目选项中!我个人觉得点符号很糟糕,所以这个例子没有使用它,这意味着属性由其关联另一端的 class 所有。

² 不相交意味着没有任何东西可以是两个专业化的实例,许多实现语言不允许,但现实世界和 UML do 允许。不完整是指可能还有其他种类的保单我们没有调出来,可以直接实例化一般的Insurance Policy.

³ 如果您更改 属性 名称,这意味着在其所有者的上下文中,该名称会掩盖通用所有者中的名称。如果您 "upcast" 专业化,相同的 属性 将具有其原始名称,因为它在广义所有者的上下文中。