2013-06-27 4 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), который определяет метамодель, состоящую из классов 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 и открытия файла B.xmi в стандартном Sample Reflective Ecore Model Editor. Вы увидите:

enter image description here

0

Это скорее хак альтернативы является объявить операцию в подклассе с тем же именем, что и имя геттерной особенностью.

Это небольшая вариация решения Вилиама Симко.

С помощью этого решения у вас не будет надлежащей функции name в классе B, но когда тогда появится функция name в классе A, ваш получатель в классе B будет называться вместо этого.

Я даже не знаю, действительно ли это разрешено. Но, похоже, он работает с EMF 2.13.0, Xcore 1.5.0.

Пример:

class ClassA { 
    String name 
} 

class ClassB extends ClassA { 
    op String getName() { 
     return "Name B" 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^