1

如下图:(<> 表示黑色菱形,表示 UML 中的组合)

+---+ 0..1   * +---+
| A |<>--------| B |
+---+          +---+

我有 A 类和 B 类。从 A 到 B 存在一个包含引用,且多重性未绑定。相反的参考具有多重性 0..1。

我的问题是:这不是相反的多重性错误/不可能吗?!因为在 Ecore 中,包含引用指定 B 只有作为 A 才能存在。因此从 B 到 A 的多重性始终为 1,不是吗?!

0..1 意味着 B 的实例可以有 A 或没有。

更新:我的任务是将以下 UML 图转换为 Ecore

+---+ 0..1   * +---+ *     1  +---+
| A |<>--------| B |--------<>| C |
+---+          +---+          +---+

我不确定如何将 UML 组合映射到 Ecore

  • 从 A 到 B 的遏制参考,上限:-1
  • B 对 A 的反向引用,下限 0,上限 1
  • 从 C 到 B 的遏制参考,上限:-1
  • 对面引用 B 到 C,下界 = 上界 = 1

我对吗 ?!

4

3 回答 3

1

你的 UML 的意思是 A 可以包含很多 B,C 包含很多 B,B 可以引用 0..1 As 和恰好一个 B。

这个 UML 图是不正确的,因为 B 的一个实例不能被共享(这就是组合的意思)。所以链接 BC 也应该是 0..1,在这种情况下,您可以使用来自 A 和 C 的遏制。

于 2012-05-29T20:29:56.400 回答
0

如果 B 是 EMF 资源的根,则它可以为零。EMF 资源根永远不会有任何容器。并且任何 EMF 模型都可以充当资源根。

于 2012-05-29T14:37:08.653 回答
0

B 的实例可以存在而不包含在 A 中,但我很确定它不能在该状态下持久化(使用默认的 XML/XMI 持久性)。事实上,你可以让一个有效的模型进入这个状态:

  • 如果您有其他对象 C,并具有对 B 的外部引用
  • A(并且根据其包含的性质,B)和C被加载到内存中并且所有引用都被解析
  • A被编辑删除B
  • C 现在将引用 B 的实例,但该实例将没有容器,并且 C 无法持久化(您将收到有关“B 不存在于资源中”的异常)。
于 2012-05-29T14:43:54.257 回答