不要修改基本生成的 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);
}