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 的回答向您展示了您想要执行的操作的正确代码。