实现接口

时间:2013-08-02 15:00:56

标签: c# .net inheritance interface

我对接口的实现感到困惑。

根据MSDN ICollection<T>,属性IsReadOnly

- 和 -

根据MSDN Collection<T>实施ICollection<T>

-SO 2 -

我认为Collection<T>会拥有属性IsReadOnly

-However -

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);

以上代码有效。

-Question -

我认为实现接口的类必须实现每个属性,那么为什么testCollection不具有IsReadOnly属性,除非你将其转换为ICollection<string>

2 个答案:

答案 0 :(得分:10)

可能正在实现属性

C#使您可以将方法定义为“显式实现的接口方法/属性”,只有在您具有确切接口的引用时才可见。这使您能够提供“更干净”的API,而不会产生太多噪音。

答案 1 :(得分:3)

接口可以通过几种方式实现。明确而含蓄地。

显式实现:当显式实现成员时,不能通过类实例访问它,而只能通过接口实例访问

隐式实现:可以访问这些接口方法和属性,就像它们是类的一部分一样。

IsReadonly属性是显式实现的,因此无法直接通过类访问。看看here

示例:

public interface ITest
{
    void SomeMethod();
    void SomeMethod2();
}

public ITest : ITest
{

    void ITest.SomeMethod() {} //explicit implentation
    public void SomeMethod2(){} //implicity implementation
}