我的模型包含一个名为Result的接口。我有多个实现上述接口的类。现在,我想将结果列表添加为“结果”。我希望能够像这样创建某事:
列表
, 哪一个
只能包含所选的Resulttype
实现我的Result接口,
是一个EObject(可以包含在Elists等中)
可以通过EMF(DomainFactory.eINSTANCE.create ...()
我尝试使用涵盖1和2的EMF泛型,但是无法在我的代码中创建它们。我只能将其用作指定泛型的其他类的超类,但我不想为所有结果创建其他List类。 DomainFactory仅向我提供ResultList 的实现。
最佳答案
我不太确定您要完成什么。
您想要一个类,它是一个EList
和Result
吗?
从技术上讲,这是可能的,并且可以通过扩展BasicEList
或实现EList
类来实现:
class ResultImpl extends BasicEList<E> implements Result
要么
class ResultImpl extends MinimalEObjectImpl.Container implements EList<E>, Result
但这一切都是无稽之谈,无论哪种方式,您都需要自己实现大量方法,并且可能会不断使EMF崩溃...
您可以做的是:让一个EClass说“
ResultList
”,将您的Result
作为超类,然后添加一个EReference
(name =“ results”,EType:Result
,(upperbound:-1)到它。因此,您可以生成一个类,该类基本上是
Results
EObjects的包装器。此外:为了使您的
ResultList
像列表一样“表现”,例如在循环中:for(Result r : aResultList)
您可以在
java.lang.Iterable<Result>
类中实现ResultList
接口,并在java.util.Iterator<Result>
类中创建自己的自定义ResultList
嵌套类,该类直接为您提供EReference的元素:例如,嵌套的Iterator类(嵌套在ResultList类中):
private class ResultIterator implements Iterator<Result> {
private int index = 0;
@Override
public boolean hasNext() {
return index < size;
}
@Override
public Result next() {
return results.get(index++);
}
}
因为已经实现了
Iterable
接口,所以需要实现public Iterator<Result> iterator()
方法,该方法仅返回您的自定义Iterator:@Override
public Iterator<Result> iterator() {
return new ResultIterator();
}
更新:
如果您决定使用通用EType参数创建EClass,并且想要创建此类的实例,则factoryImpl中应该有类似以下内容的东西:
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public <T> ResultList<T> createResultList() {
ResultListImpl<T> resultList = new ResultListImpl<T>();
return resultList;
}
因此您应该可以像这样使用它:
ResultList<Result> someResultList = Yourfactory.eINSTANCE.createResultList();