简单地说,我有以下 EMF 模型:
步骤
- 继任者
- 前任
ForkStep
扩展 Step
- 候补继任者
现在,后继者
与其前任
之间存在双向引用 - 到目前为止没有问题。
棘手的部分是:如何创建从alternateSuccessor
到其父类(super class)predecessor
的双向引用?
通常每个步骤只能有一个前置步骤和一个后继步骤。但 fork 可能有两个后继者(successor
和 alternateSuccessor
)。
如果我现在继续创建双向引用,EMF 会在父类(super class)中生成一个新属性,这似乎不太正确?
最佳答案
您的问题可以通过两种方式理解:
- 给定一个模型,我们如何检测哪个步骤是“默认”,哪个是“fork”。
- 我们如何强制用户只能创建“默认”步骤(单个后继)或“ fork ”步骤(多个后继)。
案例#1:
您需要一个类 Step
您在哪里介绍特性isForkStep
。
该属性的值将使用 OCL 导出,如下所示: successor->size() > 1
.
首先,我根据您的示例创建了元模型(称为文件 My.ecore
)。我必须添加Scenario
充当步骤容器的类。
元模型如下所示:
然后,我打开了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
)。
案例#2:
在这里,我对情况进行了不同的建模。我创建了一个界面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
关于eclipse-emf - 来自子类的双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760429/