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

在C#中如何从子类访问基类的变量值(附代码示例)

在C#中从子类访问基类变量值的正确方式

先看看你现有代码的问题:你在TestBase的Update方法里new了一个全新的TestChild实例——这个子类对象和当前的TestBase实例完全是两个独立的个体!子类里访问的a是通过基类无参构造初始化的默认值(int类型默认是0),根本不是你刚才更新到100的那个a,这就是为啥你没得到预期结果的核心原因。

下面给你两种可行的解决思路:


思路一:让子类继承并复用基类的实例状态

既然子类继承了基类,那我们完全可以直接实例化子类,通过子类的构造函数调用基类的有参构造,这样子类实例就能直接继承基类的a值,后续更新基类的a时,子类也能拿到最新值。

修改后的代码如下:

基类代码

class TestBase {
    protected int a;
    protected int b;
    public TestBase(int i) {
        a = i;
    }
    protected TestBase() { }
    // 单独拆分出更新a的方法,逻辑更清晰
    public void UpdateA(int i) {
        a = i;
    }
}

子类代码

class TestChild:TestBase {
    private string msg;
    // 显式调用基类的有参构造,初始化继承来的a
    public TestChild(int i) : base(i) { }
    
    public void Update(string s) {
        // 直接访问继承自基类的protected成员a
        msg = s + a.ToString();
        Console.WriteLine("msg=" + msg);
    }
}

调用代码

private void btnTest_Click(object sender, EventArgs e) {
    TestChild child = new TestChild(1);
    child.UpdateA(100); // 更新基类的a为100
    child.Update("Hello World ");
}

运行结果会是:msg=Hello World 100


思路二:如果必须在基类中创建子类实例,传递当前状态

要是你的业务逻辑必须在基类里生成子类对象,那就要把基类当前的a值传递给子类,让子类初始化时拿到正确的数值。

只需要修改基类的Update方法,以及给子类加对应的构造函数:

修改后的基类Update方法

public void Update(int i) {
    a = i;
    // 把当前基类的a值传给子类构造
    TestChild child = new TestChild(a);
    child.Update("Hello World ");
}

子类代码(和思路一的子类一致)

class TestChild:TestBase {
    private string msg;
    public TestChild(int i) : base(i) { }
    
    public void Update(string s) {
        msg = s + a.ToString();
        Console.WriteLine("msg=" + msg);
    }
}

这样运行后也能得到正确的结果:msg=Hello World 100


最后补充个关键知识点:C#里每个new出来的对象都是独立的,它们的成员变量互不干扰。子类能访问基类的protected成员,但前提是这个子类实例和基类实例是同一个继承链上的对象,而不是你之前那样新建一个完全无关的子类对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:59:53