C#将子类存入抽象类类型List后读取字段显示0或null如何解决
问题原因与解决方法
你将子类实例存入父类类型集合的操作本身是符合C#多态特性的,输出字段为0或null的核心原因几乎都出在抽象父类Car与子类的构造逻辑、字段定义不匹配上,以下是三种最常见的场景和对应修复方案:
1. 子类构造函数未向父类传递参数
这是新手最容易踩的坑:你在Passenger、Industrial的构造函数里接收了Id等参数,但没有调用父类Car的构造函数把值传进去,导致父类定义的Id等字段始终保持默认值(值类型为0,字符串等引用类型为null)。
错误写法示例:
public abstract class Car { public int Id; public string Name; // 其他公共字段... // 父类定义了带参构造 public Car(int id, string name, string brand, double price, condition cond, int year, type type) { Id = id; Name = name; // 其他公共字段赋值... } } public class Passenger : Car { public int SeatCount; // 错误:子类构造没有调用base()传递父类需要的参数 public Passenger(int id, string name, string brand, double price, condition cond, int year, type type, int seatCount) { // 仅给子类自有字段赋值,父类的Id、Name完全未被赋值 SeatCount = seatCount; } }
修复方法:
子类构造函数末尾加: base(参数列表),把父类需要的参数传递进去即可:
public class Passenger : Car { public int SeatCount; public Passenger(int id, string name, string brand, double price, condition cond, int year, type type, int seatCount) // 把父类需要的参数按顺序传给base构造 : base(id, name, brand, price, cond, year, type) { SeatCount = seatCount; } }
Industrial子类按照同样的逻辑修改构造函数即可。
2. 子类重复定义了和父类同名的字段
如果你在子类Passenger、Industrial里又重新定义了一遍Id、Name等和父类重名的字段,那么你给子类字段赋值后,用父类Car类型的引用访问时,会优先读取父类的同名字段,自然得到默认值。
错误写法示例:
public abstract class Car { public int Id; } public class Passenger : Car { // 错误:重复定义同名字段,隐藏了父类的Id public int Id; public Passenger(int id, ...) { // 这里赋值的是子类自己的Id,父类的Id仍然是0 this.Id = id; } }
修复方法:
删除子类中重复定义的、和父类公共字段同名的字段即可,直接使用父类定义的字段存储公共属性。
3. 执行顺序错误
请确保你调用ShowItem()之前,已经先执行过AddItems()方法完成集合的初始化,如果AddItems()未执行,会出现无输出或者集合为空的问题。
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

