我知道在继承方面,我无法在基于ecore的模型中覆盖或重新定义属性。但是,我可以以某种方式为现有的继承属性分配新值吗?
E.g。 A类定义属性 name 这是一个字符串,默认值设置为'defaultA'。 B类继承自A类, name 应具有值'defaultB'。
我试图在类B中重新实现具有相同名称和数据类型的属性,但我无法从中创建一个genmodel(“可能没有两个名为'name'的功能)。
是否甚至无法更改继承属性的值?
答案 0 :(得分:3)
在普通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
文件来对其进行测试。然后你会看到:
答案 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"
}
}