如何增加导出的 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;}
    } }