3 回答

TA貢獻1860條經驗 獲得超9個贊
這將是添加裝飾器的好地方。一些偽代碼(不完整?。┑M苊靼?。
public class VehicleDecorator : Vehicle
public VehicleDecorator(Vehicle vehicle)
{
this.vehicle = vehicle;
}
public class VehicleWithAc : VehicleDecorator
public VehicleWithAc(Vehicle vehicle) : base(vehicle){}
public override double FuelConsumption {
get{
return base.FuelConsumption+0.9 } }
然后在您的程序中創建您的汽車并使用 VehicleWithAc 裝飾器對其進行裝飾
Program
var baseCar = new Car();
var summerDriver = new VehicleWithAc(baseCar)

TA貢獻1873條經驗 獲得超9個贊
我認為你遇到的問題是你fuelConsumption作為單個變量傳遞給構造函數,從而說明
這是汽車的油耗,完全停止。
正如您所發現的,解決這個問題 - 燃油消耗不是一個靜態的東西,它取決于其他變量,例如空調是否打開。Doug 已經接近提到裝飾器了,但我認為它可以更簡單一些,但更靈活。
我認為您仍然應該傳遞一個燃油消耗數據,為了簡單起見,我們將其稱為baseFuelConsumption。請記住,車輛通常根據城市和高速公路的燃油消耗進行分級,因為它們通常不同,但出于此目的,我們將忽略它。
拋開行駛距離等,我們有:
public abstract class Vehicle
{
private readonly double _baseFuelConsumption;
protected double BaseFuelConsumption => _baseFuelConsumption;
protected Vehicle(double baseFuelConsumption) => _baseFuelConsumption = baseFuelConsumption;
public virtual double ActualFuelConsumption => BaseFuelConsumption;
}
那么,空調會額外消耗多少油耗呢?讓我們以 Doug 的答案為基點,并將其賦予我們的汽車......
public class Car : Vehicle
{
private const double _ACModifier = 0.9;
public Car()
:base(1)
{
}
public bool IsACOn { get; set; }
public override double ActualFuelConsumption
{
get
{
double consumption = base.ActualFuelConsumption;
consumption += IsACOn ? _ACModifier : 0;
return consumption;
}
}
}
現在,為了進行模擬,您可以隨著時間的推移打開和關閉交流電,并ActualFuelConsumption隨著時間的推移測量屬性。

TA貢獻1794條經驗 獲得超7個贊
如果您想使用此結構,您必須為屬性設置自定義規則。
public abstract class Vehicle
{
protected Vehicle(double fuelQuantity, double fuelConsumption)
{
this.FuelQuantity = fuelQuantity;
this._fuelConsumption = fuelConsumption;
this.FuelConsumption = fuelConsumption;
}
public double FuelQuantity { get; protected set; }
private double _fuelConsumption { get; set; }
public double FuelConsumption {
get { return _fuelConsumption; }
protected set {
_fuelConsumption = (_fuelConsumption + 0.9);
} }
public abstract string Drive(double distance);
public abstract void Refuel(double liters);
}
因為您的類是抽象的,并且派生類中的屬性沒有可重寫的屬性,所以您無法訪問基屬性。例如,您可以在集合中使用條件
public double FuelConsumption {
get { return _fuelConsumption; }
protected set {
if(Issummer)
{
_fuelConsumption = (_fuelConsumption + 0.9);
}else{ _fuelConsumption =_fuelConsumption;}
} }
- 3 回答
- 0 關注
- 149 瀏覽
添加回答
舉報