【发布时间】:2022-01-05 09:36:49
【问题描述】:
我有以下设置:
具有以下简化结构的抽象类Vehicle:
public abstract class Vehicle
{
public string Brand { get; set; }
public string Model { get; set; }
public string GetBasicInfo(Vehicle v)
{
return string.Format("This car was produced by {0}. The Model is {1}.", Brand, Model);
}
abstract public string GetVehicleData<T>(T vehicle) where T : Vehicle;
}
然后我有一个类 Car 继承自 Vehicle 并具有自己的一些属性:
public class Car : Vehicle
{
public bool Is4x4 {get;set;}
public override string GetVehicleData<Car>(Car vehicle)
{
return String.Format("Brand: {0}, Model: {1}, Is4x4: {2}", vehicle.Brand, vehicle.Model, vehicle.Is4x4);
}
}
当我尝试访问 vehicle.Is4x4 时出现错误,即 Car 不包含 Is4x4 的定义。我研究了SO,发现由于抽象父类中没有定义属性Is4x4,因此无法在覆盖方法中调用它。
为了规避这个问题,我将 2 个类更改如下:
public abstract class Vehicle
{
public string Brand { get; set; }
public string Model { get; set; }
public string GetBasicInfo(Vehicle v)
{
return string.Format("This car was produced by {0}. The Model is {1}.", Brand, Model);
}
abstract public string GetVehicleData(Vehicle vehicle);
}
还有汽车类:
public class Car : Vehicle
{
public bool Is4x4 {get;set;}
public override string GetVehicleData(Vehicle vehicle)
{
Car vehicleCast = (Car)vehicle;
return String.Format("Brand: {0}, Model: {1}, Is4x4: {2}", vehicleCast.Brand, vehicleCast.Model, vehicleCast.Is4x4);
}
}
此代码编译并允许我在 GetVehicleData 方法中添加子类特定属性。不过我觉得应该有更好的方法来解决这个常见问题。
【问题讨论】:
-
为什么
GetVehicleData首先需要一个参数?它应该做什么?不应该获取this车辆的数据吗?假设您拨打vehicleA.GetVehicleData(vehicleB)。您希望获得哪辆车的数据?