如何增加导出的 class 值
How to increase a derived class value
我正在为模拟驾驶和加油汽车和卡车的程序建模。所以这就是我到目前为止所做的:
public abstract class Vehicle
{
protected Vehicle(double fuelQuantity, double fuelConsumption)
{
this.FuelQuantity = fuelQuantity;
this.FuelConsumption = fuelConsumption;
}
public double FuelQuantity { get; protected set; }
public double FuelConsumption { get; protected set; }
public abstract string Drive(double distance);
public abstract void Refuel(double liters);
}
public class Car : Vehicle
{
public Car(double fuelQuantity, double fuelConsumption) : base (fuelQuantity, fuelConsumption)
{
}
public override string Drive(double distance)
{
}
public override void Refuel(double liters)
{
}
}
所以,我想增加0.9升汽车的油耗值(现在是夏天,所以汽车使用空调)。在哪里可以做到这一点?我不想在构造函数中这样做,因为我认为这样不行。
这是添加装饰器的好地方。
一些伪代码(不完整!)但希望你明白了。
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)
我认为您遇到的问题是您将 fuelConsumption
作为单个变量传递给构造函数,从而说明
This is the fuel consumption of the car, full stop.
正如您发现的那样,解决问题 - 油耗不是静态的,它取决于其他变量,例如空调是否打开。 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 的答案作为 base-point,然后将其提供给我们的汽车....
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
属性。
如果要使用此结构,则必须为属性设置自定义规则。
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);
}
因为您的 class 是抽象的,并且您在派生 class 中没有可覆盖的属性,您无法访问基础 properties.You 可以使用集合中的条件
public double FuelConsumption {
get { return _fuelConsumption; }
protected set {
if(Issummer)
{
_fuelConsumption = (_fuelConsumption + 0.9);
}else{ _fuelConsumption =_fuelConsumption;}
} }
我正在为模拟驾驶和加油汽车和卡车的程序建模。所以这就是我到目前为止所做的:
public abstract class Vehicle
{
protected Vehicle(double fuelQuantity, double fuelConsumption)
{
this.FuelQuantity = fuelQuantity;
this.FuelConsumption = fuelConsumption;
}
public double FuelQuantity { get; protected set; }
public double FuelConsumption { get; protected set; }
public abstract string Drive(double distance);
public abstract void Refuel(double liters);
}
public class Car : Vehicle
{
public Car(double fuelQuantity, double fuelConsumption) : base (fuelQuantity, fuelConsumption)
{
}
public override string Drive(double distance)
{
}
public override void Refuel(double liters)
{
}
}
所以,我想增加0.9升汽车的油耗值(现在是夏天,所以汽车使用空调)。在哪里可以做到这一点?我不想在构造函数中这样做,因为我认为这样不行。
这是添加装饰器的好地方。 一些伪代码(不完整!)但希望你明白了。
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)
我认为您遇到的问题是您将 fuelConsumption
作为单个变量传递给构造函数,从而说明
This is the fuel consumption of the car, full stop.
正如您发现的那样,解决问题 - 油耗不是静态的,它取决于其他变量,例如空调是否打开。 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 的答案作为 base-point,然后将其提供给我们的汽车....
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
属性。
如果要使用此结构,则必须为属性设置自定义规则。
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);
}
因为您的 class 是抽象的,并且您在派生 class 中没有可覆盖的属性,您无法访问基础 properties.You 可以使用集合中的条件
public double FuelConsumption {
get { return _fuelConsumption; }
protected set {
if(Issummer)
{
_fuelConsumption = (_fuelConsumption + 0.9);
}else{ _fuelConsumption =_fuelConsumption;}
} }