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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:44:50