[英]Override the value of an attribute in a derived Ecore-class (EMF)
我知道以下事实:在涉及继承时,我无法在基于ecore的模型中整体上重写或重新定义属性。 但是我可以以某种方式为现有的继承属性分配新值吗?
例如,类A定义属性名称 ,该名称是字符串,默认值设置为'defaultA'。 B类继承自A类,并且名称应具有值“ defaultB”。
我试图在类B中重新实现具有相同名称和数据类型的属性,但无法从中创建一个genmodel(“可能没有两个名为'name'的功能”)。
甚至不可能更改继承属性的值吗?
不,不支持。 要素的字段在基类中声明,并为该要素分配默认定义...
不能在普通EMF中覆盖属性,但是可以通过OCL解决。 (当然,您可以生成Java代码并根据需要实现属性,但在创建元模型的Eclipse实例中将无法使用。)
诀窍在于, 可以在EMF中覆盖操作,并且可以通过OCL根据需要实现操作。
下面是一个最小示例(用OCLinEcore编辑器编写),该示例定义了一个由类A
和B
组成的元模型。 类A
引入了一个属性label
,该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
文件来进行测试。 然后,您将看到:
这种相当骇人听闻的选择是在子类中声明一个与功能获取者名称同名的操作 。
这是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"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.