Collection<T>
类实现多个接口,其中一个接口为ICollection
。 ICollection
接口有2个未在Collection<T>
中实现的属性。
在C#中,我认为你必须在继承它的类中实现接口的所有方法和属性。那么Collection<T>
类如何被允许逃脱呢?
答案 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
的整个界面。