2016-09-06 58 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>这就是所谓的类(在元类中定义与遏制=真正的所有功能)。 虽然eAllContents()为您提供了所有的控制功能的一个TreeIterator<EObject>与你的等级为根树

左右(基本上它的所有直接eContents()裹成一个迭代器的返回.eContents()),如果你只想要直接包含的值功能然后只需使用eClass.eContents()

因为它并不完全清楚,我你想达到什么:

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

我会告诉你一些使用emf来获得你想要的对象的方法。

假设你有一个你的元类的实现对象(你应该知道实现和元类之间的区别,元类是你正在建模的EClass,实现是,是这个的实现EClass,但EClass是一个完全独立的对象),然后通过调用.eClass()来获得对象的meta-EClass。

每个EClass关于其宣布EReferenceEAttribute,您可以通过调用如让他们的信息:.getE[All]References(),在.getAll...也返回你EClass的定义超类中的所有元素。

因此,现在您知道如何获得您定义的元对象,但是如何在实现对象中获得表示它们的实际值?

答案是“反思”。 EMF使用所谓的反射性吸气剂(.eGet)和制定者(.eSet),它们采用EStructuralFeature并返回实际值。

因为每个EAttributeEReferenceEStructuralFeature你得到的连接从您的EClass信息反馈给你实现。

FYI:你也可以得到你的EClass的名字的EStructuralFeatures,那么你可以做这样的事情: 认为你的元素有被称为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()_方法的作用是什么?这是一个简单的getter? – finder2

+0

我正在使用现有的Ecore模型。该方法是EMF的一部分。是的,它是一个简单的getter,并且按名称的名称来做。 – landunder

0

如果那些是从子或父if语句检查以下内容:

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