[英]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.