Eclipse 重写派生Ecore类(EMF)中的属性值

Eclipse 重写派生Ecore类(EMF)中的属性值,eclipse,modeling,eclipse-emf,emf,ecore,Eclipse,Modeling,Eclipse Emf,Emf,Ecore,我知道,在基于ecore的模型中,当涉及到继承时,我不能覆盖或重新定义属性作为一个整体。但是,我可以为现有的继承属性分配一个新值吗 例如,A类定义了属性名,该属性名为字符串,默认值设置为“defaultA”。类B继承自类A,名称应具有值“defaultB” 我试图用类B中相同的名称和数据类型重新实现属性,但我无法从中创建genmodel(“可能没有两个名为'name'的特性”) 甚至不可能更改继承属性的值吗?不,这不受支持。该功能的字段在基类中声明,并指定为该功能定义的默认属性…在普通EMF中无

我知道,在基于ecore的模型中,当涉及到继承时,我不能覆盖或重新定义属性作为一个整体。但是,我可以为现有的继承属性分配一个新值吗

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

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


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

不,这不受支持。该功能的字段在基类中声明,并指定为该功能定义的默认属性…

在普通EMF中无法覆盖属性,但通过OCL有一个解决方法。 (当然,您可以根据需要生成Java代码并实现属性,但在创建元模型的Eclipse实例中,它不起作用。)

诀窍在于操作可以在EMF中重写,并且通过OCL可以根据需要实现操作

下面是一个最小的示例(用OCLinEcore编辑器编写),它定义了一个由类
a
B
组成的元模型。类
A
引入了一个属性
label
,该属性被重定向到操作
computeLabel()
。类“B”为
computeLabel()操作提供了不同的实现

包解决方案:解决方案='workaround'{
甲级{
操作computeLabel():字符串{
身体:“拉贝拉”;
}
属性标签:字符串{
派生:computeLabel();
}
}
B类扩展了A类{
操作computeLabel():字符串{
主体:“labelB”;
}
}
}
您可以通过创建类
B
的动态实例并在标准
示例反射Ecore模型编辑器中打开
B.xmi
文件来测试它。然后您将看到:


这个相当粗俗的替代方法是在子类中声明一个与feature getter name同名的操作

这是Viliam Simko溶液的轻量变体

使用此解决方案,您在类B中不会有适当的
名称
功能,但当访问类a中的
名称
功能时,将调用类B中的getter

我甚至不知道这是否真的被允许。但它似乎与EMF2.13.0、Xcore 1.5.0一起工作

例如:

A类{
字符串名
}
类B扩展了类A{
操作字符串getName(){
返回“名称B”
}
}

根据我的经验,这些事情可以在生成的代码中实现。我不知道有什么方法可以直接在模型中这样做(假设这是您想要的?)