子类的双向参考

时间:2014-11-05 15:06:57

标签: eclipse-emf emf eclipse-emf-ecore

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

Step

  • 后继
  • 前身

ForkStep延伸Step

  • alternateSuccessor

现在successor及其predecessor之间存在双向引用 - 目前尚无问题。

棘手的部分是:如何创建从alternateSuccessor到其超类predecessor的双向引用?

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

如果我现在继续创建一个双向引用,EMF会在超类中生成一个新属性,这看起来不太合适?

1 个答案:

答案 0 :(得分:1)

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

  1. 鉴于模型,我们如何检测哪个步骤是“默认”,哪个步骤是“分叉”。
  2. 我们如何强制用户只能创建“默认”步骤(单个后继者)或“分叉”步骤(多个后继者)。
  3. 案例#1:

    您需要一个类Step,您可以在其中引入属性isForkStep。 此属性的值将使用OCL导出,如下所示:successor->size() > 1

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

    然后,我使用“OCLinEcore编辑器”打开My.ecore文件,并将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个步骤的屏幕截图。正如您在“属性”视图中看到的那样,Step 1将“Is Fork Step”属性设置为true(通过单击其他步骤,您会看到false)。 enter image description here

    案例#2:

    在这里,我以不同的方式模拟了情况。我创建了一个接口Step和两个实现类 - DefaultStepForkStep。 然后,我为这两个类添加了不同的OCL约束。

    • DefaultStep:successor->size() <= 1
    • ForkStep: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