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
相关产品推荐
相关产品推荐

