微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# 虚拟属性未按预期工作

如何解决C# 虚拟属性未按预期工作

我不擅长 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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。