2010-11-10 139 views
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编辑器代码中的错误:

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

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

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

杰夫

回答

3

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

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

这有帮助吗?如果这个描述很混乱,那么创建一个带有一些非包含参考的玩具模型并为其生成EMF编辑器可能会有所帮助。

0

我不知道在EMF模型之间关联的概念是你的描述。但是,在模型中,您可以使用来引用其他模型中的元素。在您创建模型实例的通用EMF编辑器中,您可以单击右键并选择“加载资源...”。该新资源可以是与您的模型相关的任何其他模型(您的元模型引用了其他模型的元模型)。

你也可以在元模型层面。在图形Ecore编辑器中,您可以拖放其他元模型的类。他们会保持同步。

但是,我不确定,如果这是你问的。

+0

谢谢,迭戈,但没有这不是我要找的。我对交叉模型引用不感兴趣。我只想引用同一模型中的对象。问题是,我无法在生成的模型编辑器中找到一种方法来实际指向模型对象的现有实例,以确保该对象及其字段在对该对象的所有引用中都是相同的。 – 2010-11-10 22:33:02

相关问题