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

