我知道在继承方面我不能在基于 ecore 的模型中整体覆盖或重新定义属性。但是我可以以某种方式为现有的继承属性分配一个新值吗?
例如A类定义了一个字符串的属性名,默认值设置为'defaultA'。B 类继承自 A 类,名称应具有值“defaultB”。
我试图在 B 类中重新实现具有相同名称和数据类型的属性,但我无法从中创建一个 genmodel(“可能没有两个名为 'name' 的功能”)。
甚至不能更改继承属性的值吗?
我知道在继承方面我不能在基于 ecore 的模型中整体覆盖或重新定义属性。但是我可以以某种方式为现有的继承属性分配一个新值吗?
例如A类定义了一个字符串的属性名,默认值设置为'defaultA'。B 类继承自 A 类,名称应具有值“defaultB”。
我试图在 B 类中重新实现具有相同名称和数据类型的属性,但我无法从中创建一个 genmodel(“可能没有两个名为 'name' 的功能”)。
甚至不能更改继承属性的值吗?
不能在普通 EMF 中覆盖属性,但可以通过 OCL 解决。(当然,您可以根据需要生成 Java 代码并实现属性,但它在您创建元模型的 Eclipse 实例中不起作用。)
诀窍是可以在 EMF 中覆盖操作,并且通过 OCL 您可以根据需要实现操作。
下面是一个最小示例(用 OCLinEcore 编辑器编写),它定义了一个由类A
和B
. 该类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
。然后你会看到:
不,不支持。该功能的字段在基类中声明,并分配为该功能定义的默认值...
这个相当老套的替代方法是在子类中声明一个与特征 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"
}
}