C#继承方法返回子类属性失效问题求助
问题分析与解决方案
你的问题核心在于:子类Van里重新定义了和父类Taxi同名的私有字段,而私有成员的作用域仅限于自身类内部,父类的ReturnNumOfPas方法只能访问父类自己的num_of_pas,完全看不到子类里的同名私有字段,所以不管加不加this,返回的都是父类的字段值。
除了重写方法,还有以下两种可行方案:
方案一:将父类字段改为protected,子类不再重复定义同名字段
把父类中需要被子类继承使用的字段访问修饰符从private改为protected,这样子类可以直接访问这些字段,无需重新定义。同时子类只需要修改需要差异化的属性值即可:
internal class Taxi { protected string SPZ; protected int num_of_pas; protected int max_num_of_pas = 4; public virtual int ReturnNumOfPas() => num_of_pas; } internal class Van : Taxi { public Van() { max_num_of_pas = 2; // 直接修改父类的字段值,实现差异化 } }
这样Van的实例会共用父类的num_of_pas字段,调用ReturnNumOfPas时自然返回的是当前实例的正确值,避免了字段重复定义带来的混淆。
方案二:通过父类构造函数初始化差异化属性
如果希望父类的字段保持private,可以在父类中添加构造函数,让子类通过构造函数传递差异化的属性值,避免子类重复定义字段:
internal class Taxi { private string SPZ; private int num_of_pas; private int max_num_of_pas; public Taxi(int maxNumOfPas = 4) { max_num_of_pas = maxNumOfPas; } public virtual int ReturnNumOfPas() => num_of_pas; } internal class Van : Taxi { public Van() : base(2) // 调用父类构造函数,传入Van的最大乘客数 { } }
这种方式下,子类不需要重新定义任何字段,所有字段都由父类管理,ReturnNumOfPas方法访问的就是当前实例对应的父类字段值,结果自然正确。
内容的提问来源于stack exchange,提问作者Honza
相关产品推荐
相关产品推荐

