如何保证课程专业化是一致的

时间:2017-02-15 10:14:57

标签: inheritance uml aggregation composition

我有两个抽象类,代表一个组合:

  • 国家/地区(由人员制作)

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

  • 国家法国意大利
  • FrenchGuy ItalianGuy

国家/地区抽象类作为人员列表作为属性: peopleList:人员

我如何保证 French 类peopleList属性将仅使用 FrenchGuy Italy 填充与 ItalianGuy ,并使其保持一致?

我设计它的方式是反模式

enter image description here

提前感谢您的回答

2 个答案:

答案 0 :(得分:1)

基本上你可以使用Generalization Sets来做到这一点。这样可以确保来自ItalyItalian Guy(您只有男性国家/地区?)的推断是相关的,因此您只会拥有“正确”的人口。

答案 1 :(得分:1)

我将用一个不混淆的例子回答这个问题“是一种”,“是一个”的实例。 (有关更多详细信息,请参阅我对原始问题的评论。)

您确实可以保证特定专业化仅与某些其他专业化相关联。您可以使用UML关联专业化和属性重新定义来执行此操作。

redefinition example diagram

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

  • Insurance PolicyInsurable Thing之间有一个未命名的关联,它有两个属性:保险保险。它告诉我们,一般情况下,每个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最近采用了一种“点符号”,它使得关联端点上没有点模糊。预点符号,可导航属性由该关联另一端的类拥有。点后符号,该关联拥有一个可导航属性 - 除了少数工具支持它,而那些做的事情,如MagicDraw,默认情况下在项目选项中将关闭 !我个人觉得点符号可怕,所以这个例子不使用它,这意味着属性由其关联的另一端的类拥有。

²Disjoint意味着没有任何东西可以成为两种特殊化的实例,许多实现语言都不允许,但现实世界和UML 允许。不完整意味着可能存在我们尚未调出的其他类型的保险单,并且可以直接实例化一般Insurance Policy

³如果更改属性名称,这意味着,在其所有者的上下文中,该名称会使广义所有者中的名称黯然失色。如果你“upcast”特化,那么同一属性将具有其原始名称,因为它位于广义所有者的上下文中。