代码之家  ›  专栏  ›  技术社区  ›  Jeff Axelrod

如何创建对现有模型对象的引用?

  •  3
  • Jeff Axelrod  · 技术社区  · 15 年前

    我是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中成功地创建多个Widget,并且可以在ReferenceContainer中创建一个WidgetReference,并将其与特定的Widget相关联。

    如果有人遇到这种情况,则生成的EMF编辑器代码中存在错误:

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

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

    谢谢你的帮助/指导。

    杰夫

    2 回复  |  直到 15 年前
        1
  •  4
  •   awynne    15 年前

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

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

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

        2
  •  0
  •   Diego Sevilla    15 年前

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

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

    不过,我不确定你是不是在问这个问题。

    推荐文章