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

