-1

如您所见,元模型有一个具有属性的测试。这些也可以有子属性。

我现在想编写一个方法,它返回属性以及所有其他子属性。这是没有递归的天真的方法。请帮我。

public EList<TestProperty> getProperties() {
        if (properties == null) {
            properties = new EObjectContainmentEList<TestProperty>(TestProperty.class, this,
                    Iec62264Package.TEST__PROPERTIES);
        }
        for (TestProperty property : properties) {
            properties.add(property.getSubProperties());
        }
        return properties;
    }

元模型

4

1 回答 1

0

不要修改基本生成的 EMF getter 和 setter。EMF 使用它们来持久化您的模型,并且会引入明显的问题。

您可以添加 EMethod getAllProperties,或使用 Derived=true 的 EReference allProperties。您将能够给出您的具体实现,并且这些特性不涉及 EMF 持久性。

因此,保持您的属性 EReference 及其 getProperties() getter 不变,添加一个 getAllProperties() EMethod 或 allProperties 派生的 EReference,并使用以下代码对其进行编码:

/**
 * @generated
 */
public EList<TestProperty> getProperties() {
    if (properties == null) {
        properties = new EObjectContainmentEList<TestProperty>(TestProperty.class, this,
                Iec62264Package.TEST__PROPERTIES);
    }
    return properties;
}

/**
 * @generated NOT
 */
public EList<TestProperty> getAllProperties() {
    List<TestProperty> allProperties = new ArrayList<TestProperty>();
    for (TestProperty subProperty : getSubProperties()) {
        allProperties.add(subProperty);
        allProperties.addAll(subProperty.getAllProperties())
    }
    return allProperties;
}

以及返回所有子属性的 TestProperty EClass 上的方法或派生 EReference allProperties。

作为替代方案,您还可以使用魔法 Xtext 的 EcoreUtil2.getAllContentsOfType(myTest, TestProperty.class) 或从中获得灵感,并通过以下方式实现您的方法:

/**
 * @generated NOT
 */
public EList<TestProperty> getAllProperties() {
    return EcoreUtil2.getAllContentsOfType(this, TestProperty.class);
}
于 2019-02-07T05:15:59.463 回答