Eclipse 重写派生Ecore类(EMF)中的属性值
我知道,在基于ecore的模型中,当涉及到继承时,我不能覆盖或重新定义属性作为一个整体。但是,我可以为现有的继承属性分配一个新值吗 例如,A类定义了属性名,该属性名为字符串,默认值设置为“defaultA”。类B继承自类A,名称应具有值“defaultB” 我试图用类B中相同的名称和数据类型重新实现属性,但我无法从中创建genmodel(“可能没有两个名为'name'的特性”)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中无
甚至不可能更改继承属性的值吗?不,这不受支持。该功能的字段在基类中声明,并指定为该功能定义的默认属性…在普通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”
}
}
根据我的经验,这些事情可以在生成的代码中实现。我不知道有什么方法可以直接在模型中这样做(假设这是您想要的?)