如何重构代码以在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
相关产品推荐
相关产品推荐

