3

我是 MDSD/EMF 的新手,但由于 Eclipse 的支持,我取得了很大的进步。

我按照awynne的建议创建了一个玩具模型,昨天回答了这个问题,我非常接近。我只使用 EMF 及其生成的树编辑器。

这是我的 EMF 元模型的摘要:

- EClass: Widget
  - name

- EClass: WidgetReference
  - aWidgetReference : Widget [0..1] Containment = false

- EClass: WidgetContainer
  - myWidgets : Widget [0..*] Containment = true

- EClass: ReferenceContainer
  - myReferences : WidgetReference [0..*] Containment = true

- EClass: TopLevelClass
  - myWidgetContainer    : [1] WidgetContainer    Containment = true
  - myReferenceContainer : [1] ReferenceContainer Containment = true

现在发生的情况是,在为模型生成的树编辑器中,我从 TopLevelClass 开始创建所有内容。我可以在 WidgetContainer 中成功创建多个小部件,并且可以在 ReferenceContainer 中创建单个 WidgetReference 并将其与特定的 Widget 关联。

万一有人遇到这种情况,生成的 EMF 编辑器代码中有一个错误:

当我尝试向 ReferenceContainer 添加多个 WidgetReference 时,树编辑器仅显示 ReferenceContainer 下的第一个 WidgetReference。如果我单击树中的 WidgetReferences 项,它会在属性视图中显示多个 WidgetReferences。它只是不会让我在树中看到它们,因此不会让我选择它们来更改它们的引用以将其与实际的小部件相关联。

解决方法是根据需要创建尽可能多的参考,保存并关闭模型,然后重新打开它。重新打开后,将显示所有引用。

感谢您的任何帮助/指导。

杰夫

4

2 回答 2

4

我认为您的问题的答案与“遏制”的概念有关。任何对子对象具有包含引用(EMF 元模型中的 containment=true)的父对象管理该子对象的生命周期。因此,当创建子对象时,会自动生成父对象对该对象的引用。如果引用不是包含类型(containment=false),那么您可以将引用指向正确类型的任何现有模型对象。我认为您需要将您的参考设置为包含 = false。

我没有使用 Acceleo,所以让我们以 EMF 树编辑器为例(该概念也适用于 GMF 编辑器):在树编辑器中,如果父对象包含对子对象的引用,则用户可以创建通过右键单击父项并选择“new-->child-->ChildObject”来获得子项。如果对子对象的引用不是包含类型,则用户将能够通过单击父对象的属性窗口中的相应子属性来选择模型中已存在的该对象的实例。

这有帮助吗?如果此描述令人困惑,它可能有助于创建一个带有一些非包含引用的玩具模型并为其生成 EMF 编辑器。

于 2010-11-11T19:38:05.843 回答
0

我不确定 EMF 中模型之间的引用概念是您所描述的。但是,您可以在一个模型引用其他模型中的元素。在创建模型实例的通用 EMF 编辑器中,您可以单击右键,然后选择“加载资源...”。该新资源可以是与您的模型相关的任何其他模型(您的元模型引用其他模型的元模型)。

您也可以在元模型级别做到这一点。在图形 Ecore 编辑器中,您可以从其他元模型拖放类。他们将保持同步。

但是,我不确定这是否是您要问的。

于 2010-11-10T22:25:14.277 回答