eclipse-emf - 来自子类的双向引用

标签 eclipse-emf emf eclipse-emf-ecore

简单地说,我有以下 EMF 模型:

步骤

  • 继任者
  • 前任

ForkStep 扩展 Step

  • 候补继任者

现在,后继者与其前任之间存在双向引用 - 到目前为止没有问题。

棘手的部分是:如何创建从alternateSuccessor到其父类(super class)predecessor的双向引用?

通常每个步骤只能有一个前置步骤和一个后继步骤。但 fork 可能有两个后继者(successoralternateSuccessor)。

如果我现在继续创建双向引用,EMF 会在父类(super class)中生成一个新属性,这似乎不太正确?

最佳答案

您的问题可以通过两种方式理解:

  1. 给定一个模型,我们如何检测哪个步骤是“默认”,哪个是“fork”。
  2. 我们如何强制用户只能创建“默认”步骤(单个后继)或“ fork ”步骤(多个后继)。

案例#1:

您需要一个类 Step您在哪里介绍特性isForkStep 。 该属性的值将使用 OCL 导出,如下所示: successor->size() > 1 .

首先,我根据您的示例创建了元模型(称为文件 My.ecore )。我必须添加Scenario充当步骤容器的类。 元模型如下所示: enter image description here

然后,我打开了My.ecore使用“OCLinEcore 编辑器”创建文件并将 OCL 代码添加到 isForkStep属性。

package test : test = 'test'
{
    class Scenario {
        property steps : Step[*] { ordered composes };
    }
    class Step {
        attribute stepId : String { id };
        attribute isForkStep : Boolean {
            derivation: successor->size() > 1;
        }
        property predecessor#successor : Step[?];
        property successor#predecessor : Step[*] { ordered };
    }
}

然后,我通过从 Scenario 创建一个“动态实例”来测试我的新元模型。我创建了 4 个步骤。这是显示 Scenario 的屏幕截图实例连同4个步骤。正如您在“属性” View 中看到的那样,Step 1将属性“Is Fork Step”设置为 true (通过单击其他步骤,您将看到 false )。 enter image description here

案例#2:

在这里,我对情况进行了不同的建模。我创建了一个界面Step和两个实现类 - DefaultStepForkStep 。 然后,我为这两个类添加了不同的 OCL 约束。

  • 默认步骤:successor->size() <= 1
  • 叉步:successor->size() >= 2

注意:我也可能使用 successor->size() >= 2 or successor->size() = 0允许 ForkSteps 没有后继者。

元模型如下所示: enter image description here

还有许多其他方法可以实现这一点。 例如,您可以使用 Java 而不是 OCL,或者您可以以不同的方式对情况进行建模。

顺便说一句。可以在此处找到有关 EMF 中的 OCL 的精彩幻灯片: http://www.slideshare.net/EdWillink/enriching-withocl

关于eclipse-emf - 来自子类的双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760429/

相关文章:

parsing - 投影文本编辑器?

java - 如何以编程方式将通用类型参数添加到属性?

java - 有没有办法提供 EObject (EMF) 的只读表示?

java - 如何不将 DocumentRoot 写入 XML

java - 如何创建数据类型不是 EMF 类的 EAttribute?

eclipse - ecore 中 EAnnotation 的使用

使用 uml 进行 Java 编程

使用 genmodel 将 OMG 提供的 XMI 导入到 Ecore-Model?

eclipse - 扩展第三方ecore元模型