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

C#子类赋值的onlyClassA属性在父类实例中取值为0如何解决

问题原因

你拿到0输出和继承机制无关,核心错误是创建了两个完全独立、互不关联的对象实例:

  • 你写的A classA = new A()会调用A类的无参构造函数,这个构造函数没有给onlyClassA属性赋值,int类型的默认值就是0
  • 你写的B classB = new B(6)确实把当前B实例自身的onlyClassA赋值为6,所以打印classB的值能拿到6,但这个实例和前面单独new出来的classA是完全分开的两个对象,修改B实例的属性不会影响另一个独立的A实例属性值

很多初学者刚接触继承会有个误区:觉得B继承了A,改B的属性所有A的对象都会同步变化——这是完全错的,类只是创建对象的模板,每次new出来的实例都是独立的,各自的属性值单独存储,互不干扰。就像你按同一张图纸造了两辆车,给其中一辆刷成红色,另一辆不会自动变红。

修正方案

如果你的预期是让WriteValues方法打印出你赋值的6,只需要把你赋值过的classB实例传给方法就行,不需要单独new一个空的A实例:

B classB = new B(6);
Console.WriteLine("B value: " + classB.onlyClassA);
C classC = new C();
// B继承自A,也实现了IA接口,完全符合WriteValues的参数要求
classC.WriteValues(classB);

运行后就能拿到你要的输出:

B value: 6
A value: 6

另外给你一个写法优化建议:B类作为A的子类,不需要在自己的构造函数里重复给继承来的onlyClassA赋值,可以直接通过base关键字调用父类的带参构造,代码更简洁规范:

class B : A
{
    public B(int number) : base(number)
    {
        // 不需要再写 onlyClassA = number; 父类构造已经完成赋值
    }
}

补充说明:你定义的IA接口里onlyClassA是只读的,A类里给属性加了set访问器是合法的——接口只要求实现类必须存在get访问器,实现类可以自己额外加set访问器,这块代码没有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:24:22