简单地说,我有以下EMF模型:
Step
ForkStep
延伸Step
现在successor
及其predecessor
之间存在双向引用 - 目前尚无问题。
棘手的部分是:如何创建从alternateSuccessor
到其超类predecessor
的双向引用?
通常每个步骤只能有一个前任和一个后继。但是fork可能有两个后继者(successor
和alternateSuccessor
)。
如果我现在继续创建一个双向引用,EMF会在超类中生成一个新属性,这看起来不太合适?
答案 0 :(得分:1)
您的问题可以通过两种方式理解:
您需要一个类Step
,您可以在其中引入属性isForkStep
。
此属性的值将使用OCL导出,如下所示:successor->size() > 1
。
首先,我根据您的示例创建了元模型(称为文件My.ecore
)。我不得不添加一个Scenario
类作为步骤的容器。
元模型如下所示:
然后,我使用“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
)。
在这里,我以不同的方式模拟了情况。我创建了一个接口Step
和两个实现类 - DefaultStep
和ForkStep
。
然后,我为这两个类添加了不同的OCL约束。
successor->size() <= 1
successor->size() >= 2
注意:我也可以使用successor->size() >= 2 or successor->size() = 0
来允许没有后继者的ForkSteps。
元模型如下所示:
还有很多其他方法可以实现。 例如,您可以使用Java而不是OCL,或者您可以对情况进行不同的建模。
顺便说一下。关于EMF中OCL的精彩幻灯片可以在这里找到: http://www.slideshare.net/EdWillink/enriching-withocl