Ecore遏制对面

时间:2012-05-29 13:22:40

标签: eclipse eclipse-emf

图像如下:(<>表示黑色菱形,表示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相反,lowerbound = uperbound = 1

我是对的吗?!

3 个答案:

答案 0 :(得分:1)

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

这个UML图是不正确的,因为无法共享B的实例(这就是组合的含义)。所以链接B-C也应该是0..1,在这种情况下你可以使用A和C的包含。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

B的实例可以存在但不包含在A中,但我很确定它在该状态下不能持久化(使用默认的XML / XMI持久性)。实际上,您可以将有效模型置于此状态:

  • 如果你有一些其他对象,C,带有对B的外部引用
  • A(及其包含性质,B)和C被加载到内存中并且所有引用都已解析
  • 编辑A以删除B
  • C现在将引用B的实例,但该实例将没有容器并且C不能被持久化(您将获得关于“B在资源中不存在”的例外)。