覆盖派生的Ecore类(EMF)中的属性值

时间:2013-06-27 15:06:13

标签: eclipse modeling eclipse-emf emf ecore

我知道在继承方面,我无法在基于ecore的模型中覆盖或重新定义属性。但是,我可以以某种方式为现有的继承属性分配新值吗?

E.g。 A类定义属性 name 这是一个字符串,默认值设置为'defaultA'。 B类继承自A类, name 应具有值'defaultB'。

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

是否甚至无法更改继承属性的值?

3 个答案:

答案 0 :(得分:3)

在普通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的动态实例并打开标准B.xmi中的Sample Reflective Ecore Model Editor文件来对其进行测试。然后你会看到:

enter image description here

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这个相当强硬的替代方法是在子类中声明一个与特征getter名称相同的操作

这是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"
    }
}