在ECore中,包含(containment)和引用(reference)有什么区别?

24

在创建ECore实体之间的引用时,有可能将引用标记为“包含关系”。

有人能以简单易懂的话解释一下普通引用和包含关系之间的区别吗?到目前为止我找到的定义和解释都没能让我理解清楚。

2个回答

46

参考:一个参考是一个简单的"A knows B"的关系。独立的参考不会相互影响。A 可以认识 B,B 可以认识 C。因此,如果你有 A,你可以通过 B 找到 C。如果删除了参考关系,A、B 和 C 仍然存在,只是他们不再相互认识。

包含:包含是一种"A has B"的关系。通常用于列表,比如 "A 有多个 B"。ECore/EMF 可以对这些集合执行原子操作,例如将所有对象从一个容器移动到另一个容器。它还可以强制执行约束条件,例如最小数量的包含对象或最大数量的包含对象,或确保包含的对象不包含在任何其他容器中。

示例:

假设你有一个名为 ShoppingCart 的对象,其中有一个名为 Customer 的引用和一个名为 OrderedProducts 的容器。 OrderedProducts 包含对一个名为 Product 的引用。

这个模型告诉你什么?

  • 你可以给 ShoppingCart 分配一个 Customer。如果从 ShoppingCart 中删除 Customer,则 Customer 对象本身仍然存在(例如在数据库中)
  • OrderedProduct 对象需要 ShoppingCart 存在才能存在。如果从 ShoppingCart 中删除一个 OrderedProduct,则该 OrderedProduct 将停止存在。
  • 每个 OrderedProduct 都对数据库中的一个现有 Product 进行了引用。如果从 ShoppingCart 中删除其中一个 OrderedProduct,则数据库中的 Product 仍然存在-只是针对特定客户的该产品订单被删除了。

1
非常感谢。我认为像你的购物车这样的真实示例就足以在我的大脑中打开开关了。 - Kosi2801
类似于 UML 类图中的“关联”和“组合”。 - mike

5

参考:可以类比 UML 中的关联。

包含:是来自 UML 的组合关系。

在 EMF 图中也可以看到这一点,如果将 containment 设置为 true,那么线条的一侧将被填充,显示包含/组合。这是我观察到的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接