0

我想检索 Ecore 类的容器。所以我有一个这样的结构:

class SuperClass{
    protected EObject superClassProperty;   
}

class SubClass extends SuperClass{
    private EObject subClassProperty;
}

现在我想获取子类(subClassProperty)的所有包含。我这样做:

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

但是如果我这样做,我也会得到超类的继承容器(superClassProperty)。我如何才能检索给定类中包含的那些(只是 subClassProperty)?

4

3 回答 3

1

如果您指的是ecore,我假设您正在使用EObject元素。EveryEObject实现了.eContents().eAllContents()方法。

它们之间的区别是:

  • .eContents()为您提供List<EObject>调用它的类的所有直接包含特性(在包含 = true 的元类中定义的所有特性)。
  • eAllContents()为您TreeIterator<EObject>提供以您的类为根的树中的所有包含功能(基本上它返回.eContents()所有直接eContents()包装到迭代器中的内容)。

因此,如果您只想要直接包含的特征的值,那么只需使用eClass.eContents().

因为我并不完全清楚您要达到的目标:

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

我将向您展示一些使用 emf 获取所需对象的方法。

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

每个EClass都有关于它的声明EReference和它的信息EAttribute,你可以通过调用 eg: 来获得它们.getE[All]References().getAll...它还返回你的定义的超类的所有元素EClass

所以现在您知道如何获取您定义的元对象,但是如何在您的实现对象中获取表示它们的实际值呢?

答案是“反思”。EMF 使用所谓的反射 getter ( .eGet) 和 setter ( .eSet) ,它们接受一个EStructuralFeature并返回它的实际值。

因为每一个你EAttribute都可以从你的信息中获得连接到你的实现。EReferenceEStructuralFeatureEClass

仅供参考:您还可以通过名称获取 EClass 的 EStructuralFeatures,然后您可以执行以下操作:假设您的元素有一个 Attribute ,name然后调用它:

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

为您提供元素属性的实际值。

于 2016-09-06T14:17:20.020 回答
0

我认为你还没有像这样的超类:

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

所以没有子类的实例。您真的使用了正确的方法和正确的参数数量和类型吗?

子类是否有存储元素的字段?

于 2016-09-06T10:38:10.663 回答
0

以下 if 语句检查这些是来自子类还是超类:

eClass.getEAllContainments().get(i).EContainingClass.name == eClass.name
于 2016-09-06T13:01:48.060 回答