C#继承类ToString方法多态失效问题求助
问题分析与解决方案
核心问题
你当前的代码中,所有从数据库加载的卡片对象都是Card基类实例,而非对应的子类(比如ÖverPanda)。即便给type属性赋值,对象的实际运行时类型仍是Card,因此调用ToString()时只会执行基类方法,多态机制无法生效。
解决步骤
1. 修改数据库加载逻辑,按类型创建子类实例
在LoadDBCard方法的while (reader.Read())循环中,不要直接创建Card对象,而是根据读取到的KortTyp字段值,实例化对应的子类:
while (reader.Read()) { string kortNr = reader.GetValue(0).ToString(); string kortTyp = reader.GetValue(1).ToString(); Card newListItem; // 根据卡片类型创建对应子类实例 switch(kortTyp) { case "Överpanda": newListItem = new ÖverPanda(kortNr); break; // 补充其他三个子类的case分支,例如: // case "SilverKatt": // newListItem = new SilverKatt(kortNr); // break; default: // 处理未知类型,可按需抛出异常或创建基类实例 newListItem = new Card(kortNr); newListItem.type = kortTyp; break; } CardList.Add(newListItem); }
2. 验证子类构造逻辑
确保每个子类的构造函数正确初始化type和claimed属性,比如你已实现的ÖverPanda类:
public ÖverPanda(string inCardID) : base(inCardID) { type = "Överpanda"; claimed = true; }
子类实例化时无需额外手动设置type,避免冗余代码。
3. 确认多态方法的正确性
你的基类ToString()标记为virtual、子类用override重写的写法是正确的,只要对象是子类实例,调用ToString()时就会自动触发子类的重写方法。
额外说明
如果移除基类的ToString(),默认会调用Object.ToString()返回类的完全限定名(比如Guldkortet_Server.Card),这是因为此时对象的实际类型是Card基类,因此必须确保实例化为子类才能触发子类的重写方法。
内容的提问来源于stack exchange,提问作者sidiz
相关产品推荐
相关产品推荐

