Eclipse Ecore安全壳对面

Eclipse Ecore安全壳对面,eclipse,eclipse-emf,Eclipse,Eclipse Emf,下图:(表示一个黑色菱形,它表示UML中的合成) +--+0..1*+---+ |A |--------B| +---+ +---+ 我有A类和B类。A包含引用存在于A到B之间,多重性未绑定。相反引用的重数为0..1 我的问题是:这种相反的多重性是不是错了/不可能?!因为在Ecore中,包含引用指定B只能作为A存在。因此从B到A的多重数总是1,不是吗 0..1意味着B的实例可以有A,也可以没有A 更新:我的任务是将下面的UML图转换成Ecore +---+ 0..1 *

下图:(表示一个黑色菱形,它表示UML中的合成)

+--+0..1*+---+
|A |--------B|
+---+          +---+
我有A类和B类。A包含引用存在于A到B之间,多重性未绑定。相反引用的重数为0..1

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

0..1意味着B的实例可以有A,也可以没有A

更新:我的任务是将下面的UML图转换成Ecore

+---+ 0..1   * +---+ *     1  +---+
| A |<>--------| B |--------<>| C |
+---+          +---+          +---+
+--+0..1*+--+*1+---+
|A |------B |------C|
+---+          +---+          +---+
我不知道如何将UML组合映射到Ecore

  • 从A到B的安全壳参考,上限:-1
  • 与A相对的参考B,下界0,上界1
  • 从C到B的安全壳参考,上限:-1
  • 相反的参考B到C,下界=上界=1

我说的对吗

如果B是EMF资源的根,则它可以为零。EMF资源根从来没有任何容器。任何EMF模型都可以充当资源根。

如果B是EMF资源的根,则它可以为零。EMF资源根从来没有任何容器。任何EMF模型都可以充当资源根。

B的实例可以存在而不包含在a中,但我非常确定它不能保持在该状态(使用默认的XML/XMI持久性)。事实上,您可以使有效的模型处于以下状态:

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

    • B的实例可以存在而不包含在A中,但我非常确定它不能持久化为该状态(使用默认的XML/XMI持久化)。事实上,您可以使有效的模型处于以下状态:

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

      您的UML的意思是A可以包含许多B,C可以包含许多B,B可以引用0..1作为B,并且正好是一个B


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

      您的UML的意思是A可以包含许多B,C包含许多B,B可以引用0..1作为一个B


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

      但是如果它不是根元素呢?如果它不是根元素,并且被序列化,那么它就不能为null。但将其设置为0..1并不是错误,因为在某些情况下可能是这样。但如果它不是根元素呢?如果它不是根元素,并且已序列化,则它不能为null。但将其设置为0..1并不是一个错误,因为在某些情况下这是可能的。
      +---+ 0..1   * +---+ *     1  +---+
      | A |<>--------| B |--------<>| C |
      +---+          +---+          +---+