【问题标题】:Ecore containment opposite对面的 Ecore 遏制
【发布时间】:2012-05-30 04:29:56
【问题描述】:

如下图:(表示黑色菱形,指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
  • A 的对向引用 B,下限 0,上限 1
  • 从 C 到 B 的包含引用,上限:-1
  • 相对于 B 到 C 的引用,下限 = 上限 = 1

我说的对吗?!

【问题讨论】:

    标签: eclipse eclipse-emf


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但是如果它不是根元素呢?
      • 如果不是根元素,并且是序列化的,那么一定不能为null。但是设置为0..1也不是错误,因为有可能的情况。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 2012-02-27
        • 2011-12-02
        • 2012-02-15
        相关资源
        最近更新 更多