问题描述
我不擅长 C# 接口,所以这是我的误解。 我有这个接口(PMQIdent 只是一个标识符):
public interface IisNamedItem2 {
// note: is virtual
public virtual PMQIdent name {
get => name;
private set => name = value;
}
}
这样使用:
public class TVDeclarationStatement2 : IisNamedItem2 {
// ctor
public TVDeclarationStatement2(PMQIdent nameIn) =>
name = nameIn;
}
但它抱怨“当前上下文中不存在名称'name'”
因为我标记了相关部分是虚拟的,我希望它被带到类中(编辑:意思是有效地复制到 using 类的定义中,所以它只会在那里而不是我每次都必须添加它)。
如果我将界面重写为
public interface IisNamedItem999 {
private PMQIdent _name;
public virtual PMQIdent getName() => _name;
public virtual PMQIdent sestName(PMQIdent val) =>
_name = val;
}
它 - 相当合理 - 抱怨“接口不能包含实例字段”
正确的做法是什么?
更重要的是,是什么让我误解了这个概念?
非常有用的答案和评论。我接受了 Stefan 的回答,因为它解释了为什么我的想法是错误的。谢谢大家,我有一些很好的链接可以阅读。
解决方法
更重要的是,是什么让我误解了这个概念?
实现接口只是告诉类它必须包含哪些方法和属性。如果接口中有你的属性,它不会自动出现在继承它的类中。只有当您从其他类继承时才会发生这种情况。
所以如果你有 PQIdent Name { get;放;在您的界面中,您还必须编写 PQIdent Name { get;放; } 在你的班级里。
“虚拟”仅表示您可以在类中覆盖此方法或属性。在您的示例中,您可以为您的属性声明其他 get/set,而不是在您的界面中。您可以使用继承自接口的类中的“覆盖”关键字来完成此操作。
Ivan Khorin 的回答向您展示了您想要执行的操作的正确代码。
,public interface IisNamedItem2
{
// note: is virtual
PMQIdent Name { get; set; }
}
public class TVDeclarationStatement2 : IisNamedItem2
{
public virtual PMQIdent Name { get; set; }
public TVDeclarationStatement2(PMQIdent nameIn)
{
Name = nameIn;
}
}