Inheritance 如何保证类专门化是一致的

Inheritance 如何保证类专门化是一致的,inheritance,uml,aggregation,composition,Inheritance,Uml,Aggregation,Composition,我有两个抽象类,代表一个组合: 国家(由人民组成) 人 我将这两个类具体化,例如: 国家:法国和意大利 人物:法国人和意大利人 将Country抽象类作为人员列表作为属性:peopleList:people 我如何保证France class peopleList属性将仅用FrenchGuy填充,意大利语Guy填充意大利,并使其一致 我设计它的方式是否是一种反模式 提前感谢您的回答基本上您可以使用。这将确保来自意大利和意大利佬(你有一个只有男性的国家?)的概括是相关的,因此你将只拥有“

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

  • 国家(由人民组成)
我将这两个类具体化,例如:

  • 国家:法国和意大利
  • 人物:法国人和意大利人
将Country抽象类作为人员列表作为属性:peopleList:people

我如何保证France class peopleList属性将仅用FrenchGuy填充,意大利语Guy填充意大利,并使其一致

我设计它的方式是否是一种反模式


提前感谢您的回答

基本上您可以使用。这将确保来自
意大利
意大利佬
(你有一个只有男性的国家?)的概括是相关的,因此你将只拥有“正确的”人口。

我将用一个不会混淆“是一种”和“是一种”的例子来回答这个问题。(详情请参阅我对原问题的评论。)

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

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

  • 保险单
    可保物品
    之间有一个未命名的关联,它有两个属性:保险人和投保人。它告诉我们,一般来说,每个
    保险单
    为一个或多个
    可保物品
    投保,每个
    可保物品
    可以由任何数量的
    保险单
    投保
  • 保险单
    有两个不相交的专业:
    健康保险单
    汽车保险单
  • 可保物品
    有两个不相交的专业:
    汽车
  • 顶部的未命名关联具有两个具有更特定属性约束的专门关联:
    • 汽车保险单
      汽车
      之间的关联具有重新定义其允许类型的属性
    • 健康保险单
      个人
      之间的关联具有属性,这些属性可重新定义其允许的类型(即收紧)
专门的协会和重新定义正在这里做所有的工作。如果愿意,可以进一步收紧多重性,甚至更改属性名称


1注意,UML最近采用了一种“点表示法”,使得关联末端没有点的情况变得模棱两可。在点表示法之前,可导航属性由关联另一端的类拥有。点标记后,可导航属性归关联所有——除了很少有工具支持它之外,还有一些工具支持它,例如MagicDraw,默认情况下在项目选项中关闭点!我个人觉得点表示法很可怕,所以这个示例没有使用它,这意味着属性属于其关联另一端的类

²不相交意味着没有任何东西可以成为这两种专门化的实例,这是许多实现语言不允许的,但现实世界和UML确实允许。“不完整”意味着可能还有其他种类的保险单,我们还没有调用,可以直接实例化通用的
保险单


如果您更改了一个属性名称,这意味着,在其所有者的上下文中,该名称会掩盖广义所有者中的名称。如果“向上投射”专门化,则同一属性将具有其原始名称,因为它位于通用所有者的上下文中。

我不完全理解您提供的关于通用集和属性的链接中所描述的内容。例如,在我的例子中,意大利和意大利佬之间的联系是如何实现的?这就是他们所说的权力类型吗?你可以用特定的国家(
:France
:Italy
)键入每个概括。您可能不需要任何约束。或者,您将组合向下移动到远离抽象的特定类。您在示例中混淆了“是一种”和“是的一个实例”。这是一个巨大的反模式!今天晚些时候,我可能有时间解释如何正确地执行此操作。使用泛化集是一种误导。@JimL.:You have mixed”是一种“with”,是“在您的示例中”的一个实例。事实上,这是我的示例,选择得不是很好。在我看来,法国和意大利需要专业化,而不是实例。例如,法国有一个getCheese()方法,意大利有一个getPizza()类,它大致对应于一组实例。“法国”系列中有哪些实例?如果你用一个可行的图表来更新这个问题,我可以告诉你如何说左边的东西只有右边更具体的东西。我不能用一个无效的例子。好的,让我们用一个经典的保险例子。比方说,我在上面的例子中称之为“国家”的是保险“法国”和“意大利”分别是保险类型1和保险类型2,假设“人”是位置。”“法国人”和“意大利人”都是公务员和公司雇员。问题是,如何将保险类型1连接到公务员,将保险类型2连接到公司员工?好的,谢谢Jim L。给出了非常详细的答案。就实现而言,我想这并不像简单的继承那样简单,也不像组合或聚合那样简单。在DB级别(通过ORM抽象)和编程级别(不考虑DB),是否有一种众所周知的模式来获得这样的结构?有关ORM,请参阅或