我有一个这样的类:
public partial class GmxGlobalList : DynamicBindingListBase<GmxGlobal>
其中DynamicBindingListBase
实现从IEnumerable<T>
扩展而来的Collection<T>
——在本例中为IEnumerable<GmxGlobal>
。
类GmxGlobal
的定义类似
public partial class GmxGlobal : IGmxGlobal
我现在想像一样申报GmxGlobalList
public partial class GmxGlobalList : DynamicBindingListBase<GmxGlobal>, IEnumerable<IGmxGlobal>
但这不起作用,因为我应该声明方法IEnumerator<IGmxGlobal> GetEnumerator()
——但这已经从Collection<T>
实现了——但不是用IGmxGlobal
实现的,而是用GmxGlobal
实现的。我想问你,为什么我必须实施IEnumerator<IGmxGlobal> GetEnumerator()
?-我可以声明,GmxGlobalList是IGmxGlobal
的IEnumerable
、ICollection
或IList
(或者可以枚举IGmxGlobal
的其他东西)。
由于DynamicBindingListBase<T>
实现了IEnumerable<T>
,而GmxGlobalList
继承了DynamicBindingListBase<GmxGlobal>
并实现了IEnumerable<IGmxGlobal>
CCD_ 22实现了CCD_ 23和CCD_。
我假设DynamicBindingListBase<T>
已经有了IEnumerable<T>
的具体实现。由于IEnumerable<IGmxGlobal>
的作用域比IEnumerable<GmxGlobal>
的作用域更广,因此此实现不能作为IEnumerable<IGmxGlobal>
工作。
如果你只有以下内容:
GmxGlobalList : DynamicBindingListBase<GmxGlobal>
由于IEnumerable
是共变体,您已经可以将GmxGlobalList
用作IEnumerable<IGmxGlobal>
。像这样:
IEnumerable<IGmxGlobal> foo = new GmxGlobalList();
如果您真的需要实现IEnumerable<IGmxGlobal>
,您可以编写实现细节来包装DynamicBindingListBase<GmxGlobal>
。
public IEnumerator<IGmxGlobal> GetEnumerator()
{
return (base as IEnumerator<GmxGlobal>).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
这行得通吗?
IEnumerable<IGmxGlobal> e = (IEnumerable<GmxGlobal>)instanceOfGmxGlobalList;