我有以下設定:
具有以下簡化結構的抽象類 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 方法中添加子類特定屬性。但是我覺得應該有更好的方法來解決這個常見問題。
uj5u.com熱心網友回復:
問題是這一行:
public override string GetVehicleData<Car>(Car vehicle)
這和寫法一樣:
public override string GetVehicleData<T>(T vehicle)
...除了您已用作Car型別引數的名稱,而不是更傳統的T. Carthere 沒有參考 class Car,而是參考了一個新的泛型型別引數。
當您覆寫泛型方法時,該語言不會強制您使用相同的型別引數名稱:您可以撰寫
public abstract class Vehicle
{
public abstract string GetVehicleData<T>(T vehicle) where T : Vehicle;
}
public class Car : Vehicle
{
public abstract string GetVehicleData<T2>(T2 vehicle) { ... }
}
...并且您選擇使用Car而不是T2.
要解決根本問題,您不能定義基本方法Vehicle.GetVehicleData(Vehicle vehicle),然后用更具體的Car.GetVehicleData(Car car). 如果有人這樣做會叫什么new Car().GetVehicleData(new Truck())?
Car 的GetVehicleData方法需要能夠接受任何型別的Vehicle.
也就是說,尚不清楚您為什么要GetVehicleData乘坐第二輛車,而不是僅僅在其定義的實體上運行。
寫這樣的東西會更正常:
public abstract class Vehicle
{
public string Brand { get; set; }
public string Model { get; set; }
public string GetBasicInfo()
{
return string.Format("This car was produced by {0}. The Model is {1}.", Brand, Model);
}
public abstract string GetVehicleData();
}
public class Car : Vehicle
{
public bool Is4x4 {get;set;}
public override string GetVehicleData()
{
return String.Format("Brand: {0}, Model: {1}, Is4x4: {2}", Brand, Model, Is4x4);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405256.html
標籤:
上一篇:基于可選泛型引數的回傳型別
下一篇:dart中如何使用泛型。
