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

  • 国家(人民组成)

  • 我在这两个类中具体化了:
  • 国家:法国和意大利
  • 人:FrenchGuy和ItalianGuy

  • Country抽象类作为人员列表作为属性: peopleList:人

    我如何保证,使France class peopleList属性仅用FrenchGuy填充,而Italy用ItalianGuy填充,并使之保持一致?

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

    inheritance - 如何保证类(class)特化是一致的-LMLPHP

    预先感谢您的回答

    最佳答案

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

    实际上,您可以保证特定的专业仅与某些其他专业相关联。您可以使用UML关联专门化和属性重新定义来实现。

    inheritance - 如何保证类(class)特化是一致的-LMLPHP

    我将带您了解一下此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之类的工具也默认支持在项目选项中关闭点!我个人发现点符号令人讨厌,因此本示例未使用它,这意味着属性由其关联另一端的类拥有。

    ²不相交意味着两种专业都不能成为实例,这是许多实现语言所不允许的,但现实世界和UML确实允许。不完整意味着可能还有其他我们尚未调出的保险单,并且可以直接实例化一般Insurance Policy

    ³如果更改属性名称,这意味着在其所有者的上下文中,该名称将使通用所有者中的名称黯然失色。如果您“抛弃”专业化,则相同的属性将具有其原始名称,因为它是在广义所有者的上下文中。

    10-05 20:19