请考虑以下代码:
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时的编译器错误。
答案 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) { /* ... */ }
}