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

时间:2016-05-10 23:43:26

标签: c# .net inheritance interface

Collection<T>类实现多个接口,其中一个接口为ICollectionICollection接口有2个未在Collection<T>中实现的属性。

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

3 个答案:

答案 0 :(得分:7)

这称为explicitly implementing an interface。除非将对象引用转换为接口类型,否则可以使成员从外部看不到。

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

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

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

class Customer : IFile, IDatabaseRecord
{
    public void Save()
    {
        //what to do here?
    }
}

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

class Customer : IFile, IDatabaseRecord
{
    void IFile.Save() { }
    void IDatabaseRecord.Save() { }
}

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

答案 1 :(得分:2)

阅读完评论后,问题是这些属性已明确实施,您可以注意到here

bool ICollection.IsSynchronized 
{
  get { return false; }
}

请注意,它不是一个常见的属性,如:

public bool IsSynchronized 
{
  get { return false; }
}

这基本上意味着该属性存在,但只有当您将其转换为ICollection

var c = new Collection<double>();
var casted = (ICollection) c;
var isSync = casted.IsSynchronized;

答案 2 :(得分:1)

它的叔叔为框架工作,每个人只是看起来相反。

Collection<T>投射为ICollection,您会看到它实现了ICollection的整个界面。