5

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

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

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

甚至不能更改继承属性的值吗?

4

3 回答 3

4

不能在普通 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。然后你会看到:

在此处输入图像描述

于 2014-11-26T09:43:28.673 回答
3

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

于 2013-07-01T15:04:38.803 回答
1

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

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

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

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

例子:

class ClassA {
    String name
}

class ClassB extends ClassA {
    op String getName() {
        return "Name B"
    }
}
于 2017-11-15T09:56:42.967 回答