2016-09-06 2 views
-1

Я хочу получить защитные оболочки класса Ecore. Так что у меня, например, структуру, как это:Получить защитные оболочки класса Ecore

class SuperClass{ 
    protected EObject superClassProperty; 
} 

class SubClass extends SuperClass{ 
    private EObject subClassProperty; 
} 

Теперь я хочу, чтобы получить все контейнменты из подклассов (subClassProperty). Я делаю это так:

EList<EReference> _eAllContainments = eClass.getEAllContainments(); 

Но если я, так что я также получить наследуемые контейнменты из суперкласса (superClassProperty). Как я могу просто получить те, которые содержатся в данном классе (только subClassProperty)?

+0

Что случилось с вопросом? Некоторая обратная связь была бы подходящей, чтобы спросить ее надлежащим образом. – landunder

+0

Я думаю, вам нужно больше объяснять проблему, с которой вы сталкиваетесь. ;) –

ответ

1

Если вы ссылаетесь на Ecore, я предполагаю, что вы используете EObject элементы. Каждый EObject реализует метод .eContents() и .eAllContents().

Разница между ними:

.eContents() дает вам List<EObject> со всеми прямыми функциями локализации (все функции, определенные в мета-классе с сдерживанием = True) класса он призвал. Хотя eAllContents() дает вам TreeIterator<EObject> со всеми функциями локализации в дереве с классом как корень (в основном это возвращает .eContents() на все прямой eContents() завернутого в итератор)

Итак, если вы хотите только значения содержащихся на диск непосредственно особенности затем просто использовать eClass.eContents()

Потому что это не совсем для меня ясно, что вы пытаетесь достичь с помощью:

EList<EReference> = _eAllContainments = eClass.getEAllContainments();

Я покажу вам несколько способов использования ЭДС для получения желаемых объектов.

Предполагается, что у вас есть объект реализации вашего метакласса (вы должны знать разницу между реализацией и метаклассом, метакласс - это EClass, который вы моделируете, а реализация - это, да, реализация этого EClass, но EClass - это полный независимый объект), тогда вы получите свой мета-класс вашего объекта, вызвав на нем .eClass().

Каждый EClass имеет информацию о заявленной EReference и его EAttribute, вы получите их по телефону, например: .getE[All]References(), то .getAll... также возвращает все элементы определенных супер классов вашего EClass.

Итак, теперь вы знаете, как получить определенные метаобъекты, но как вы можете получить фактические значения, представляющие их в вашем объекте реализации?

Ответ «отражение». EMF использует так называемый отражающий геттер (.eGet) и сеттер (.eSet), которые принимают EStructuralFeature и возвращают фактическое значение для него.

Потому что каждый EAttribute и EReference является EStructuralFeature вы получаете соединение от вашей EClass информации вашей реализации.

FYI: Вы можете также получить EStructuralFeatures вашего EClass по имени, то вы могли бы сделать что-то вроде этого: Предполагаемая ваш элемент имеет атрибут, который называется name затем:

element.eGet(element.eClass().getEStructuralFeature("name")); 

дает вам фактическое значение для атрибута вашего элемента.

+0

Это сделало вещи более ясными. Чтобы получить защитные оболочки, я беру '.getERefernces()', а затем проверяю, '' isContainment() ' – landunder

0

Я думаю, что вы не instatiatet суперкласса, как:

List<Superclass> list = new ArrayList<>(); 
    list.add(new Superclass()); 

так нет экземпляра подкласса. Вы действительно использовали правильный метод с правильным количеством и типом параметров?

Есть ли в подклассе поле, в котором хранятся элементы?

+0

В коде нет ошибки. У меня есть модель Ecore, в которой структура уже установлена. – landunder

+0

Откуда вы получаете eClass. Вы знаете, что у вас есть экземпляр подкласса? Что делает метод _getEAllContainments() _ do? Это простой геттер? – finder2

+0

Я использую существующую модель Ecore. Этот метод является частью EMF. Да, это простой геттер и делает то, что предлагает название. – landunder

0

Следующих если оператор проверяет, если те находятся в подменят или суперкласс:

eClass.getEAllContainments().get(i).EContainingClass.name == eClass.name