类没有实现接口,代码仍然编译

时间:2012-11-23 16:34:47

标签: c# interface

我需要创建一个实现IBindingList的自定义集合,以便能够将它与来自第三方的自定义控件绑定。我的另一个问题是我必须使该集合线程安全,因为我同时从多个线程手动插入项目。

无论如何我在班上使用BindingList<T>作为一个字段,以便不再重新发明轮子。所以我的班级看起来像:

class ThreadSaveBindingCollection<T> : IEnumerable<T>, IBindingList
{
    BindingList<T> collection;
    object _lock = new object();

    // constructors
    public ThreadSaveBindingCollection(IEnumerable<T> initialCollection)
    {
        if (initialCollection == null)
            collection = new BindingList<T>();
        else                            
            collection = new BindingList<T>(new List<T>(initialCollection));                                 
    }
    public ThreadSaveBindingCollection() : this(null)
    {            
    }   

    // Todo: Implement interfaces using collection to do the work    
}

注意我缺少实现接口IEnumerable和IBinding列表。 我正在计划使用字段collection来处理它,因为它也实现了这些接口。因此,我让visual studio明确地实现了接口,并将throw new NotImplementedException()替换为字段collection实现,最终得到的结果如下:

enter image description here

现在的问题是

如果集合声称要实现IBindingList,为什么我不能在字段集合上调用AddIndex方法!

enter image description here

我无法对多种方法做同样的事情

3 个答案:

答案 0 :(得分:1)

BindingList明确表示,您需要将collection的引用转换为IBindingList才能使用它:

(collection as IBindingList).AddIndex(property);

http://msdn.microsoft.com/en-us/library/ms132679.aspx

Further reading

通过接口本身的引用显式实现和访问的目的是解决命名冲突,其中双方创建具有相同方法签名的两个单独的接口 - 它允许您在仍然实现两个接口的同时消除方法的歧义。 p>

答案 1 :(得分:1)

这是因为它是接口的显式实现,而不是隐式的。这意味着您必须通过界面而不是类型本身来调用它。例如:

((IBindingList)collection).AddIndex(property);

有关显式接口实现的更多信息,请参阅here

答案 2 :(得分:1)

BindingList明确实现IBindingList,因此您需要执行

(collection as IBindingList).AddIndex(property);