我有两个抽象类,代表一个组合:
我对这两个类进行了具体化,例如:
国家/地区抽象类作为人员列表作为属性: peopleList:人员
我如何保证 French 类peopleList属性将仅使用 FrenchGuy 和 Italy 填充与 ItalianGuy ,并使其保持一致?
我设计它的方式是反模式?
提前感谢您的回答
答案 0 :(得分:1)
基本上你可以使用Generalization Sets来做到这一点。这样可以确保来自Italy
和Italian Guy
(您只有男性国家/地区?)的推断是相关的,因此您只会拥有“正确”的人口。
答案 1 :(得分:1)
我将用一个不混淆的例子回答这个问题“是一种”,“是一个”的实例。 (有关更多详细信息,请参阅我对原始问题的评论。)
您确实可以保证特定专业化仅与某些其他专业化相关联。您可以使用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,默认情况下在项目选项中将关闭 !我个人觉得点符号可怕,所以这个例子不使用它,这意味着属性由其关联的另一端的类拥有。
²Disjoint意味着没有任何东西可以成为两种特殊化的实例,许多实现语言都不允许,但现实世界和UML 允许。不完整意味着可能存在我们尚未调出的其他类型的保险单,并且可以直接实例化一般Insurance Policy
。
³如果更改属性名称,这意味着,在其所有者的上下文中,该名称会使广义所有者中的名称黯然失色。如果你“upcast”特化,那么同一属性将具有其原始名称,因为它位于广义所有者的上下文中。