我意識到在繼承時,我無法在基於ecore的模型中重寫或重新定義屬性作爲整體。但是,我能以某種方式爲現有的繼承屬性賦予新的值嗎?覆蓋派生Ecore類(EMF)中屬性的值
E.g.類A定義屬性名稱這是一個字符串,默認值設置爲'defaultA'。 B類繼承自A類,並且名稱應該具有值'defaultB'。
我試着只是在B類中重新實現了具有相同名稱和數據類型的屬性,但我無法從中創建genmodel(「可能沒有兩個名爲'name'的特性」)。
是不是可以更改繼承屬性的值?
我意識到在繼承時,我無法在基於ecore的模型中重寫或重新定義屬性作爲整體。但是,我能以某種方式爲現有的繼承屬性賦予新的值嗎?覆蓋派生Ecore類(EMF)中屬性的值
E.g.類A定義屬性名稱這是一個字符串,默認值設置爲'defaultA'。 B類繼承自A類,並且名稱應該具有值'defaultB'。
我試着只是在B類中重新實現了具有相同名稱和數據類型的屬性,但我無法從中創建genmodel(「可能沒有兩個名爲'name'的特性」)。
是不是可以更改繼承屬性的值?
不,這不被支持。該特性的字段在基類中聲明並指定爲該特性定義的默認值...
不能在普通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
類的動態實例,並在標準Sample Reflective Ecore Model Editor
打開B.xmi
文件進行測試。然後,您會看到:
這個相當hackish的替代方案是聲明的操作在子類中具有相同的名稱作爲特徵的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"
}
}
根據我的經驗,這類事情可以在生成的代碼來實現。我不知道有什麼方法可以直接在模型中執行此操作(假設這是您想要的?) – sxc731