【问题标题】:Override the value of an attribute in a derived Ecore-class (EMF)覆盖派生 Ecore 类 (EMF) 中的属性值
【发布时间】:2013-06-25 04:05:08
【问题描述】:

我知道当涉及到继承时,我不能在基于 ecore 的模型中整体覆盖或重新定义属性。但是我能以某种方式为现有的继承属性分配一个新值吗?

例如A 类定义了属性name,它是一个字符串,默认值设置为'defaultA'。 B 类继承自 A 类,name 应该具有值“defaultB”。

我试图在 B 类中重新实现具有相同名称和数据类型的属性,但我无法从中创建一个 genmodel(“可能没有两个名为 'name' 的特征”)。

难道不能改变继承属性的值吗?

【问题讨论】:

  • 根据我的经验,这类事情可以在生成的代码中实现。我不知道直接在模型中执行此操作的方法(假设这是您想要的?)

标签: eclipse modeling eclipse-emf emf ecore


【解决方案1】:

在纯 EMF 中不能覆盖属性,但可以通过 OCL 解决。 (当然,您可以根据需要生成 Java 代码并实现属性,但它在您创建元模型的 Eclipse 实例中不起作用。)

诀窍在于可以在 EMF 中覆盖操作,并且通过 OCL,您可以根据需要实现操作。

下面是一个最小示例(用 OCLinEcore 编辑器编写),它定义了一个由类 AB 组成的元模型。类A 引入了一个属性label,它只是重定向到操作computeLabel()。 “B”类为 computeLabel() 操作提供了不同的实现。

package workaround : workaround = 'workaround' {
    class A {
        operation computeLabel() : String {
            body: 'labelA';
        }
        attribute label : String {
            derivation: computeLabel();
        }
    }
    class B extends A {
        operation computeLabel() : String {
            body: 'labelB';
        }
    }
}

您可以通过创建类B 的动态实例并在标准Sample Reflective Ecore Model Editor 中打开B.xmi 文件来对其进行测试。然后你会看到:

【讨论】:

    【解决方案2】:

    不,不支持。该功能的字段在基类中声明,并分配为该功能定义的默认值...

    【讨论】:

      【解决方案3】:

      这个相当老套的替代方法是在子类中声明一个与特征获取器名称同名的操作

      这是 Viliam Simko 解决方案的轻量级变体。

      使用此解决方案,您将不会在 B 类中拥有正确的 name 功能,但是当访问 A 类中的 name 功能时,将调用您在 B 类中的 getter。

      我什至不知道这是否真的被允许。但它似乎适用于 EMF 2.13.0、Xcore 1.5.0。

      例子:

      class ClassA {
          String name
      }
      
      class ClassB extends ClassA {
          op String getName() {
              return "Name B"
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多