明确实现不可更改的基类的接口

时间:2014-02-24 19:45:11

标签: c# interface override base enumerator

首先,这个问题与How to call an explicitly implemented interface-method on the base class非常相似,但不一样。

我的问题是我甚至无法向相关的基类添加任何辅助方法来解决该问题中解决的问题。

代码:

class AsyncObservableCollection<T> : ObservableCollection<T>
{

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return new ThreadSafeEnumerator<T>(this.GetEnumerator(), this.mutex);
    }
}

ObservableCollection<T>来自实施Collection<T>的{​​{1}}。

编译错误:

IEnumerable<T>

问题:

所以我的目标是使用我的AsyncObservableCollection<T>.IEnumerable<...>.GetEnumerator()': containing type does not implement interface 'System.Collections.Generic.IEnumerable<T> 实例获取任何foreach循环以获取我的自定义枚举器,同时允许我的自定义方法中的AsyncObservableCollection<T>仍然获得“标准”枚举器。我不确定最好的方法是什么。

1 个答案:

答案 0 :(得分:2)

您只需显式声明该类实现该接口。不要依赖基类实现它的事实:

class AsyncObservableCollection<T> : ObservableCollection<T>, IEnumerable<T>

话虽如此,作为一个好的设计,我建议不要让隐式接口实现与其他实现完全不同。相反,你应该有一个方法/属性来获取“其他”版本,或者甚至可能都有两个迭代器,这样当调用者的迭代语义不同时,它就非常清楚了。 (最重要的是,它允许用户使用带有foreach循环的任一类型的语义,而不是手动迭代迭代器只是为了获得不同的语义。