2013-06-27 89 views
3

我意識到在繼承時,我無法在基於ecore的模型中重寫或重新定義屬性作爲整體。但是,我能以某種方式爲現有的繼承屬性賦予新的值嗎?覆蓋派生Ecore類(EMF)中屬性的值

E.g.類A定義屬性名稱這是一個字符串,默認值設置爲'defaultA'。 B類繼承自A類,並且名稱應該具有值'defaultB'。

我試着只是在B類中重新實現了具有相同名稱和數據類型的屬性,但我無法從中創建genmodel(「可能沒有兩個名爲'name'的特性」)。

是不是可以更改繼承屬性的值?

+0

根據我的經驗,這類事情可以在生成的代碼來實現。我不知道有什麼方法可以直接在模型中執行此操作(假設這是您想要的?) – sxc731

回答

2

不,這不被支持。該特性的字段在基類中聲明並指定爲該特性定義的默認值...

3

不能在普通EMF中覆蓋屬性,但通過OCL有一個解決方法。 (當然,您可以根據需要生成Java代碼並實現屬性,但在創建元模型的Eclipse實例中不起作用。)

訣竅是,操作可以在EMF中覆蓋並通過OCL您可以根據需要實施操作。

下面是一個小例子,(寫在OCLinEcore編輯),它定義一個元模型包括類AB。類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文件進行測試。然後,您會看到:

enter image description here

0

這個相當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" 
    } 
}