我的模型包含一个名为Result的接口。我有多个实现上述接口的类。现在,我想将结果列表添加为“结果”。我希望能够像这样创建某事:

列表

, 哪一个


只能包含所选的Resulttype
实现我的Result接口,
是一个EObject(可以包含在Elists等中)
可以通过EMF(DomainFactory.eINSTANCE.create ...()


我尝试使用涵盖1和2的EMF泛型,但是无法在我的代码中创建它们。我只能将其用作指定泛型的其他类的超类,但我不想为所有结果创建其他List类。 DomainFactory仅向我提供ResultList 的实现。

最佳答案

我不太确定您要完成什么。
您想要一个类,它是一个EListResult吗?
从技术上讲,这是可能的,并且可以通过扩展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();

09-16 04:24