c#:property中的接口继承不继承get访问器

时间:2016-06-15 19:52:35

标签: c# .net

请考虑以下代码:

public interface IFoo
{
    int Bar { get; }
}

public interface IModifiableFoo : IFoo
{
    int Bar { set; }
}

public class FooImpl : IModifiableFoo
{
    public int Bar { get; set; }
}

static void Main()
{
    IModifiableFoo f = new FooImpl();
    int bar = f.Bar; // Compiler error
}

这是错误消息:

  

错误CS0154:属性或索引器' MyNamespace.IModifiableFoo.Bar'不能在这种情况下使用,因为它缺少get访问器

由于IModifiableFoo继承了IFoo,因此应该可以访问get访问者(即get_Bar()方法)。这是怎么回事?

注意:这与问题Adding setter to inherited read-only property in C# interface不同,因为该问题不能解决通过可写接口调用getter时的编译器错误。

3 个答案:

答案 0 :(得分:4)

原因是您的IModifiableFoo界面的属性隐藏了从IFoo继承的属性,而不是覆盖它。因此,如果您希望在派生界面中使用get功能,则必须明确添加它。

实际上,您最好使用Bar关键字在IModifiableFoo中标记new属性,以明确显示它隐藏了某些内容,以便在查找时不会感到困惑代码。

答案 1 :(得分:1)

吸气者和背叛者不是个人成员。因此,一个接口中的setter不会添加到基接口的getter中。相反,接口只定义成员,这里的成员是可读或可写属性。

继承接口定义了一个与基接口同名的属性(成员)。所以它将隐藏基接口的成员。因此,使用两个接口,您现在可以显式实现两个成员:

int IFoo.Bar { get; }
int IModifiableFoo.Bar { set; }

请注意,编译器应该向您发出有关此行为的警告,并建议您在继承接口中使用new键盘将其标记为有意:

public interface IModifiableFoo : IFoo
{
    new int Bar { get; set; }
}

答案 2 :(得分:-1)

不要在这里使用属性和接口继承。使用常规方法和两个单独的接口:

public interface IFooReader
{
    int GetBar();
}

public interface IFooWriter
{
    void SetBar(int value);
}

public class FooImpl : IFooReader, IFooWriter
{
    public int GetBar() { /* ... */ }
    public void SetBar(int value) { /* ... */ }
}