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

如何重构代码以在WebAPI中调用虚方法并触发派生类实现?

解决方案

要让派生类的PrintCar生效,核心是利用多态性——必须调用派生类实例的方法,而非直接调用基类静态方法。按以下步骤修改:

1. 完善Car基类:添加工厂方法+调整虚方法

给Car类添加静态工厂方法,根据ID返回对应派生类实例;同时把PrintCar从void改为返回字符串(WebAPI需要向客户端返回内容,而非输出到控制台):

public class Car
{
    public string Brand { get; set; }
    public int ManufactureYear { get; set; }

    // 静态工厂方法:根据ID生成对应派生类实例
    public static Car GetCarById(int id)
    {
        // 模拟ID匹配逻辑:比如ID=1返回Electric实例
        if (id == 1)
        {
            return new Electric 
            { 
                Brand = "Tesla", 
                ManufactureYear = 2024, 
                BatteryCapacity = 75 // Electric类独有属性
            };
        }
        // 其他ID返回普通Car实例或其他派生类
        return new Car 
        { 
            Brand = "Toyota", 
            ManufactureYear = 2023 
        };
    }

    // 调整虚方法:返回字符串替代控制台输出
    public virtual string PrintCar()
    {
        return $"{Brand} {ManufactureYear}";
    }
}

2. 确保派生类正确重写方法

Electric类必须用override关键字重写PrintCar,保证多态逻辑生效:

public class Electric : Car
{
    public int BatteryCapacity { get; set; }

    public override string PrintCar()
    {
        // 输出Electric专属信息
        return $"{Brand} {ManufactureYear} (Electric, Battery: {BatteryCapacity} kWh)";
    }
}

3. 修改WebAPI端点代码

原代码中Car.PrintCar(id)是错误的静态调用,现在改为先通过工厂方法获取实例,再调用实例的PrintCar:

app.MapGet("/cars/{id}", (int id) => 
{
    Car car = Car.GetCarById(id);
    return car.PrintCar(); // 多态生效:若为Electric实例,自动调用其重写方法
});

关键原理

当基类引用(Car car)指向派生类实例(Electric)时,调用car.PrintCar()会自动触发派生类的重写方法,这就是C#多态的核心作用。


内容的提问来源于stack exchange,提问作者MeLlmaoEphteban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:37:50