C# virtual 属性 未按预期工作
C# virtual property is not working as expected
我对 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' 在当前上下文中不存在”
因为我标记相关部分是虚拟的,所以我希望它被带入 class(编辑:意思是有效地复制到使用 class 的定义中,所以它会只是 在那里 而不是我每次都必须添加它)。
如果我将界面重写为
public interface IisNamedItem999 {
private PMQIdent _name;
public virtual PMQIdent getName() => _name;
public virtual PMQIdent sestName(PMQIdent val) =>
_name = val;
}
它 - 相当合理 - 抱怨“接口不能包含实例字段”
正确的做法是什么?
更重要的是,我缺少什么概念性的东西让我误解了这一点?
非常有帮助的回答和评论。我接受了 Stefan 的回答,因为它解释了 为什么 我的想法是错误的。谢谢大家,我有一些很好的阅读链接。
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;
}
}
More importantly, what is the conceptual thing I’m missing that is making me misunderstand this?
实现接口只是告诉 class 它必须包含哪些方法和属性。如果界面中有你属性,它不会自动在你的class中继承它。只有当您从另一个 class.
继承时才会发生这种情况
因此,如果您有 PMQIdent 名称 { get;放; } 在您的界面中,您还必须编写 PMQIdent Name { get;放; } 在你的 class.
“虚拟”仅表示您可以在 class 中覆盖此方法或 属性。在您的示例中,您可以为您的 属性 声明一个与您的界面中不同的 get/set。您可以在从界面继承的 class 中使用“override”关键字来执行此操作。
Ivan Khorin 的回答向您展示了您想要执行的操作的正确代码。
我对 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' 在当前上下文中不存在”
因为我标记相关部分是虚拟的,所以我希望它被带入 class(编辑:意思是有效地复制到使用 class 的定义中,所以它会只是 在那里 而不是我每次都必须添加它)。
如果我将界面重写为
public interface IisNamedItem999 {
private PMQIdent _name;
public virtual PMQIdent getName() => _name;
public virtual PMQIdent sestName(PMQIdent val) =>
_name = val;
}
它 - 相当合理 - 抱怨“接口不能包含实例字段”
正确的做法是什么?
更重要的是,我缺少什么概念性的东西让我误解了这一点?
非常有帮助的回答和评论。我接受了 Stefan 的回答,因为它解释了 为什么 我的想法是错误的。谢谢大家,我有一些很好的阅读链接。
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;
}
}
More importantly, what is the conceptual thing I’m missing that is making me misunderstand this?
实现接口只是告诉 class 它必须包含哪些方法和属性。如果界面中有你属性,它不会自动在你的class中继承它。只有当您从另一个 class.
继承时才会发生这种情况因此,如果您有 PMQIdent 名称 { get;放; } 在您的界面中,您还必须编写 PMQIdent Name { get;放; } 在你的 class.
“虚拟”仅表示您可以在 class 中覆盖此方法或 属性。在您的示例中,您可以为您的 属性 声明一个与您的界面中不同的 get/set。您可以在从界面继承的 class 中使用“override”关键字来执行此操作。
Ivan Khorin 的回答向您展示了您想要执行的操作的正确代码。