I'm aware of the fact that I cannot override or redefine attributes as a whole in an ecore-based model when it comes to inheritance. But can I somehow assign a new value to an existing, inherited attribute?
E.g. Class A defines the attribute name which is a string, the default value is set to 'defaultA'. Class B inherits from Class A and name should have the value 'defaultB'.
I tried to just reimplement the attribute with the same name and datatype in Class B, but I cannot create a genmodel from that ("There may not be two features named 'name'").
Isn't it even possible to change the value of an inherited attribute?
Attributes cannot be overridden in plain EMF but there is a workaround through OCL. (Of course, you can generate Java code and implement the attributes as needed but it won't work in the Eclipse instance where you created the meta-model.)
The trick is that operations can be overridden in EMF and through OCL you can implement the operations as needed.
Below is a minimal example (written in OCLinEcore editor) that defines a meta-model consisting of classes A
and B
. The class A
introduces an attribute label
which is just redirected to the operation computeLabel()
. Class 'B' provides a different implementation for the computeLabel()
operation.
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';
}
}
}
You can test it by creating a dynamic instance of class B
and opening the B.xmi
file in the standard Sample Reflective Ecore Model Editor
. You'll then see:
No, that's not supported. The field for the feature is declared in the base class and that assigns the default defined for the feature...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With