实现接口
本文关键字:接口 实现 | 更新日期: 2023-09-27 18:26:07
我对接口的实现感到困惑。
根据MSDN,ICollection<T>
具有属性IsReadOnly
-和-
根据MSDN Collection<T>
实现ICollection<T>
-所以-
我认为Collection<T>
将具有属性IsReadOnly
。
-然而,
Collection<string> testCollection = new Collection<string>();
Console.WriteLine(testCollection.IsReadOnly);
上面的代码给出了编译器错误:
'System.Collections.ObjectModel.Collection<string>' does not contain a definition for 'IsReadOnly' and no extension method 'IsReadOnly' accepting a first argument of type
'System.Collections.ObjectModel.Collection<string>' could be found (are you missing a using directive or an assembly reference?)
-While-
Collection<string> testInterface = new Collection<string>();
Console.WriteLine(((ICollection<string>)testInterface).IsReadOnly);
以上代码有效。
-问题-
我认为实现接口的类必须实现每个属性,那么为什么testCollection
没有IsReadOnly
属性,除非将其强制转换为ICollection<string>
?
它可能显式地实现了属性。
C#使您能够将方法定义为"显式实现的接口方法/属性",只有当您有确切接口的引用时,这些方法才可见。这使您能够提供一个"更清洁"的API,没有那么多噪音。
接口可以通过两种方式实现。明示和暗示。
显式实现:当成员显式实现时,不能通过类实例访问,只能通过接口的实例访问
隐式实现:可以访问接口方法和属性,就好像它们是类的一部分一样。
IsReadonly
属性是显式实现的,因此不能直接通过类访问。看看这里。
示例:
public interface ITest
{
void SomeMethod();
void SomeMethod2();
}
public ITest : ITest
{
void ITest.SomeMethod() {} //explicit implentation
public void SomeMethod2(){} //implicity implementation
}