我有两个抽象类,代表一个组合:
我在这两个类中具体化了:
Country抽象类作为人员列表作为属性: peopleList:人
我如何保证,使France class peopleList属性仅用FrenchGuy填充,而Italy用ItalianGuy填充,并使之保持一致?
我的设计方式是反模式吗?
预先感谢您的回答
最佳答案
我将以一个不会混淆“是一种”与“是……的实例”的示例来回答这个问题。 (有关更多详细信息,请参阅我对原始问题的评论。)
实际上,您可以保证特定的专业仅与某些其他专业相关联。您可以使用UML关联专门化和属性重新定义来实现。
我将带您了解一下此UML图告诉我们的内容:
Insurance Policy
和Insurable Thing
之间有一个未命名的关联,具有两个属性:被保险人和被保险人。它告诉我们,一般而言,每个Insurance Policy
都会确保一个或多个Insurable Things
,并且每个Insurable Thing
都可以使用任意数量的Insurance Policies
进行保险。¹Insurance Policy
具有两个不相交的²专长:Health Insurance Policy
和Car Insurance Policy
。 Insurable Thing
具有两个不相交的专长:Car
和Person
。 Car Insurance Policy
和Car
之间的关联具有可通过重新定义(即加强)其允许类型的属性。 Health Insurance Policy
和Person
之间的关联具有可通过重新定义(即加强)其允许类型的属性。 专业协会和重新定义在这里完成所有工作。如果愿意,您可以进一步收紧多重性,甚至更改属性名称³。
¹请注意,UML最近采用了“点表示法”,该点表示在关联的末端缺少点是模棱两可的。点号之前,可导航属性由关联另一端的类拥有。发布点表示法后,该关联就拥有了一个可导航的属性-除了几乎没有工具支持该工具的事实之外,并且诸如MagicDraw之类的工具也默认支持在项目选项中关闭点!我个人发现点符号令人讨厌,因此本示例未使用它,这意味着属性由其关联另一端的类拥有。
²不相交意味着两种专业都不能成为实例,这是许多实现语言所不允许的,但现实世界和UML确实允许。不完整意味着可能还有其他我们尚未调出的保险单,并且可以直接实例化一般
Insurance Policy
。³如果更改属性名称,这意味着在其所有者的上下文中,该名称将使通用所有者中的名称黯然失色。如果您“抛弃”专业化,则相同的属性将具有其原始名称,因为它是在广义所有者的上下文中。