emf递归子属性

dw1jzc5e  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(298)

如您所见,元模型有一个测试,它具有属性。这些也可以有子属性。
我现在要编写一个方法,它将返回属性以及所有其他子属性。这里是没有递归的简单方法。请帮帮我。

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;
    }

元模型

iyzzxitl

iyzzxitl1#

不要修改基本生成的emf getter和setter。emf使用它们来持久化您的模型,这将引入明显的问题。
您可以添加emethod getallproperties,或者使用derived=true添加ereference allproperties。您将能够给出具体的实现,而emf持久性中不涉及这些特性。
因此,保持您的properties ereference及其getproperties()getter不变,添加getallproperties()方法或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。
或者,您也可以使用magic xtext的ecoreutil2.getAllContentSoftType(mytest,testproperty.class)或从中获得灵感,并使用以下工具实现您的方法:

/**
 * @generated NOT
 */
public EList<TestProperty> getAllProperties() {
    return EcoreUtil2.getAllContentsOfType(this, TestProperty.class);
}

相关问题