Collection <T>不包含ICollection接口的所有属性

Abh*_*Net 4 .net c# inheritance interface

Collection<T>类实现多个接口,其和为一ICollection.该ICollection接口有2个未实现的属性Collection<T>.

在C#中,我认为你必须在继承它的类中实现接口的所有方法和属性.那么如何Collection<T>允许上课呢?

Bas*_*Bas 7

这称为显式实现接口.除非将对象引用转换为接口类型,否则可以使成员从外部不可见.

Collection<T>实现的上下文中ICollection,有问题的接口定义了在将泛型引入C#之前存在的遗留方法.你可以说这是管理馆藏的"丑陋"方式.

实现者决定隐藏这些丑陋的方法,同时仍然向调用者提供其功能.

var x = new Collection<int>();
object syncRoot = x.SyncRoot; //CS1061: Collection<int> does not contain a ....
ICollection collection = x;
syncRoot = collection.SyncRoot; //ok
Run Code Online (Sandbox Code Playgroud)

另一种情况是存在冲突,通常是由于外部接口设计不合理而且无法更改.一个例子:

interface IFile
{
    void Save();
}
interface IDatabaseRecord
{
    void Save();
}

class Customer : IFile, IDatabaseRecord
{
    public void Save()
    {
        //what to do here?
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以通过明确地实现该方法来克服:

class Customer : IFile, IDatabaseRecord
{
    void IFile.Save() { }
    void IDatabaseRecord.Save() { }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这几乎总是代码味道 - 它可能会使调用者误以为方法不存在,或调用错误的实现(导致此问题首先发布).