我有一个接口说 IMyInterface 这是由类_290167实现的_如何用getter和setter声明属性来覆盖而不是掩盖接口中的属性?
例如,对于界面:
public interface IMyInterface
{
String MyProperty {get;}
}
如果我这样做,我隐藏了接口属性
public class MyClass : IMyInterface
{
public String MyProperty
{
get
{
return "Whatever";
}
}
}
但如果我这样做,我会收到一条错误消息,说 MyProperty 不能公开:
public class MyClass : IMyInterface
{
public String IMyInterface.MyProperty
{
get
{
return "Whatever";
}
}
}
6 回答
由于接口没有实现,覆盖是一个不适用于接口的概念 . 因此,接口成员不需要
virtual
.您在使用 class inheritance 时覆盖 . 您需要在基类中创建它们
virtual
,并在子类中使用override
关键字:如果你 explicitly implement an interface ,则不需要
public
修饰符,因为只有当使用者使用接口类型时才能看到该成员:由于
IFoo.Bar
仍然仅与界面相关联,因此它仍然隐含public
. 在Java中,您可以根据需要添加public
修饰符(当然是可选的) . 相反,C#禁止这样做 .隐藏是什么意思?您的第一个示例是接口属性的正常,隐式实现 . 你没有隐藏它,你正在实施它 .
你的第二个例子是明确的界面实现 - 它不能公开设计 . 只有当变量类型为
IMyInterface
时,您才能调用它 .你当然可以在实现类中将你的属性标记为
virtual
,以允许它在iheritting类中被覆盖,但这是另一个故事 .接口成员是隐含的
public
,您可以在接口中使用任何访问说明符和接口成员 .interface C# - MSDN
评论:
由于您正在执行Explicit interface implementation,因此只能针对接口对象调用该方法,不能针对类对象调用该方法 . 由于接口的所有成员都是隐式的,因此这将是多余的,这就是不允许的原因 .
看这篇文章:Explicit interface implementation – to hide interface member in implementing type
这可能会有所帮助Interface Properties (C# Programming Guide)
在接口中声明属性实际上并不在接口上提供属性的实现 .
即陈述
实际上,您只需要提供接口的实现必须提供具有getter的属性
MyProperty
. 我确实同意语法很容易与automatic properties混淆,但在接口的情况下,没有支持字段 .更新
显式接口实现用于区分多个接口需要相同属性名称的情况 . 可能以下澄清了这一点?