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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:50:30