Collection<T>
类实现了多个接口,其中一个是ICollection
。 ICollection
接口有2个属性在Collection<T>
中没有实现。
在C#中,我认为您必须在继承它的类中实现接口的所有方法和属性。那么Collection<T>
类如何逃脱呢?
Collection<T>
类实现了多个接口,其中一个是ICollection
。 ICollection
接口有2个属性在Collection<T>
中没有实现。
在C#中,我认为您必须在继承它的类中实现接口的所有方法和属性。那么Collection<T>
类如何逃脱呢?
ICollection
的Collection<T>
上下文中,所涉及的接口定义了在泛型引入到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() { }
}
IFile
的方法,并且将Customer
的实例传递给它,那么类型为IFile
的参数将具有一个Save()
方法。更重要的是,它将调用IFile.Save()
,如果我没有记错的话。 - Royal Bg在阅读了您的评论后,问题是这些属性是显式实现的,正如您可以在这里看到的那样:
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;
Collection<T>
转换为ICollection
,你会发现它实现了整个ICollection
接口。