C#中派生类重写的自动实现属性与基类虚拟属性值为何不同?
问题解析:为什么派生类实例的id和基类实例的id不同?
嘿,这其实是面向对象编程中关于类实例独立性的常见误解,咱们一步步拆解清楚:
核心原因:每个实例都是独立的对象
不管是基类bbase的实例b2,还是派生类Derived的实例d2,它们都是完全独立的内存对象,各自拥有自己的属性存储(id属性背后的私有字段)。你对其中一个实例的属性赋值,完全不会影响另一个实例的属性值。
再看你的代码逻辑
你写的派生类Derived重写id属性的代码:
public override int id { get { return base.id; } set { base.id = value; } }
这里的base.id指的是当前派生类实例自己的基类成员部分,而不是其他基类实例(比如b2)的id。继承的意义是让派生类拥有基类的成员,而不是和其他基类实例共享这些成员。
举个生活化的例子:把bbase看作“手机”,Derived看作“智能手机”。你给一台普通手机(b2)设置了锁屏密码为6,另一台智能手机(d2)的锁屏密码肯定不会自动变成6——因为它们是两台完全不同的设备,只是共享了“有锁屏密码”这个特性而已。
验证一下
如果想让d2的id变成6,你需要直接给d2.id赋值:
d2.id = 6;
这时候输出d2.id就会得到6,因为你修改的是d2这个实例自己的基类部分的id值。
内容的提问来源于stack exchange,提问作者M. Asif
相关产品推荐
相关产品推荐

