2016-09-06 9 views
-1

Ecore 클래스의 포함을 검색하려고합니다.Ecore 클래스의 포함 물 검색

class SuperClass{ 
    protected EObject superClassProperty; 
} 

class SubClass extends SuperClass{ 
    private EObject subClassProperty; 
} 

가 지금은 서브 클래스 (subClassProperty)의 모든 오염물을 얻으려면 : 그래서 예를 들어이 같은 구조를 가지고있다. 내가 이런 식으로 작업을 수행합니다

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

을하지만 내가 할 경우 내가 또한 슈퍼 클래스 (superClassProperty)의 상속 된 구조를 얻는다. 주어진 클래스 (단지 subClassProperty)에 포함 된 것을 어떻게 검색 할 수 있습니까?

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

그래서 서브 클래스의 어떤 인스턴스가 없습니다 :

+0

질문에 대한 잘못된 점이 있습니까? 일부 피드백은 적절한 방식으로 질문하는 것이 적절할 것입니다. – landunder

+0

나는 당신이 직면 한 문제에 대해 더 많은 설명이 필요하다고 생각한다. ;) –

답변

1

, 난 당신이 EObject 요소를 사용하고 있다고 가정합니다. 모든 EObject.eContents().eAllContents() 메소드를 구현합니다.

그들 사이의 차이는 다음과 같습니다

.eContents() 당신에게 모든 직접 견제 기능을 가진 List<EObject>가 켜져이라고 클래스의 (봉쇄 = 사실과 메타 클래스에 정의 된 모든 기능)을 제공합니다. eAllContents() 루트로 당신의 클래스와 나무에 당신에게 모든 견제 기능을 갖춘 TreeIterator<EObject>을 제공 동안 만 직접 포함 된 값을 원한다면

(기본적으로는 직접 반복자에 랩 eContents() 모두에 .eContents()을 반환)

EList<EReference> = _eAllContainments = eClass.getEAllContainments : 당신이 무엇을 달성하고 싶은지 나에게 완전히 명확하지 않기 때문에 기능은 단순히 eClass.eContents()

를 사용();

원하는 개체를 얻기 위해 emf를 사용하는 몇 가지 방법을 보여 드리겠습니다.

메타 클래스의 구현 개체가 있다고 가정하면 (구현과 메타 클래스의 차이점을 알아야합니다. 메타 클래스는 모델링하는 EClass이며 구현은 예입니다. 구현의 예입니다. EClass이지만 EClass는 완전한 독립 Object입니다.) .eClass()을 호출하여 Object의 meta-EClass를 가져옵니다..getE[All]References()에서, .getAll...은 또한 당신의 EClass의 정의 슈퍼 클래스의 모든 요소를 ​​반환

모든 EClassEReferenceEAttribute를 선언, 당신은 예를 들어 호출하여 얻을 수에 대한 정보가 있습니다.

이제는 정의한 메타 오브젝트를 얻는 방법을 알고 있지만 구현 오브젝트에서이를 나타내는 실제 값을 얻으려면 어떻게해야할까요?

대답은 "반영"입니다. EMF는 반사 게터 (.eGet)와 설정자 (.eSet)를 사용하며,이 값은 EStructuralFeature이며 실제 값을 반환합니다.

EReferenceEStructuralFeature이므로 EClass 정보를 구현에 다시 연결합니다.

참고 : 당신은 또한 이름으로 ECLASS의 EStructuralFeatures는, 당신은 그런 일 할 수 얻을 수 있습니다 :

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

당신에게 실제 값을 제공 : 당신의 요소 세웠 은 다음 name라고하는 특성이있다 귀하의 요소의 속성에 대한.

+0

이렇게하면 더 명확 해졌습니다. 포함을 얻으려면'.getERefernces()'를 취한 다음'isContainment()'가 있는지 확인합니다. – landunder

0

나는 당신이 좋아하는 슈퍼 클래스를 instatiatet하지 않은 생각합니다. 올바른 숫자와 유형의 매개 변수를 사용하여 올바른 방법을 실제로 사용하고 있습니까?

하위 클래스에 요소가 저장된 필드가 있습니까? 사람이 하위 또는 상위 클래스에서 경우 문을 검사하는 경우 다음과 같은

+0

아니요 코드에 오류가 없습니다. 구조가 이미 설정된 Ecore 모델이 있습니다. – landunder

+0

어디에서 eClass를 가져 옵니까? 하위 클래스의 인스턴스를 가지고 있는지 확인해 주시겠습니까? _getEAllContainments() _ 메소드는 무엇을 수행합니까? 이것은 단순한 게터인가? – finder2

+0

기존 Ecore 모델을 사용하고 있습니다. 이 방법은 EMF의 일부입니다. 예, 그것은 단순한 getter이며 이름에서 알 수있는 것을 수행합니다. – landunder

0

: 당신이는 Ecore로 다스 려하는 경우

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