You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:继承基类并覆写属性的正确方法咨询

派生类覆写基类属性的正确方式

你的写法是不正确的,原因很简单:你在Derived类里定义的a是一个字段,而基类Base里的a是一个用virtual修饰的只读属性——这属于成员隐藏(hiding),并不是你想要的覆写(overriding),两者的行为完全不同。

要正确覆写基类的virtual属性,你需要遵循以下几个规则:

  • 必须在派生类的对应成员上使用override关键字,明确告知编译器这是对基类成员的覆写
  • 派生类的成员类型、访问级别(不能比基类更严格)、属性的读写特性要和基类保持一致(基类是只读属性,派生类也得是只读属性)

正确的覆写示例

class Base 
{ 
    public virtual string a => SomeMethod(a); 
    // 注意:原基类的属性getter调用SomeMethod(a)会触发无限递归,建议修正逻辑,比如传入其他参数
    private string SomeMethod(string input)
    {
        // 这里编写实际的方法逻辑
        return input;
    }
}

class Derived : Base 
{ 
    // 使用override关键字覆写基类的只读属性
    public override string a => "Hello"; 
}

如果你希望派生类的属性支持赋值操作(类似你原写法里字段直接赋值的效果),可以改成带私有字段的属性形式,同时遵循覆写规则:

class Derived : Base 
{ 
    private string _a = "Hello";
    public override string a 
    { 
        get => _a; 
        // 注意:如果基类是只读属性,这里不能添加set访问器,否则会编译错误;只有基类是读写virtual属性时才能加set
        // set => _a = value;
    }
}

另外提个小细节:如果是故意要隐藏基类的同名成员(而非覆写),编译器会给出警告,此时可以加上new关键字明确标记:public new string a = "Hello";,但这并不是继承覆写的正确方式——当用基类引用指向派生类实例时,访问的还是基类的属性,而非派生类的字段,这一般不是你想要的继承效果。

内容的提问来源于stack exchange,提问作者user3740951

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:25:53