Декоратор с абстракцией, не получает должным образом оформленное значение - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь сделать Шаблон оформления декоратора и вот что я получил:

Мой базовый класс - abstract Worker класс:

public abstract class Worker
{
    public float Salary { get; set; }
    public abstract float CountSalary();
}

Worker является базовым классом для Driver:

public class Driver : Worker
{
    public float Salary { get; set; }
    public override float CountSalary() => Salary = 3000;
    //for testing i just hard coded '3000' value
}

Мой декоратор - класс abstract Bonus. Он украшает зарплату работника бонусами.

public abstract class Bonus : Worker
{
    public Bonus(Worker worker) => this.worker = worker;
    public override float CountSalary() => worker.Salary;
    protected Worker worker { get; private set; }
}

public class AmountBonus : Bonus
{
    public AmountBonus(Worker worker) : base(worker: worker){ }
    public override float CountSalary() => base.worker.Salary + 200;
}

Я вызываю Decorator таким образом в моем коде:

Worker w = new AmountBonus(new Driver());

И вместо 3200, новый Salary = 200. Не могли бы вы сказать мне, когда я делаю ошибку, и меня не предсказывают Salary = 3200? Почему, когда я звоню так:

Worker w = new AmountBonus(new AmountBonus(new Driver()));

Мой Salary не складывается до значения 3400?

1 Ответ

0 голосов
/ 08 января 2019

Я сделал некоторые изменения в вашем коде:

 public abstract class Worker
{
    public abstract float Salary { get; } 
}

public class Driver : Worker
{
       public class Driver : Worker
      {
    float _salary = 0;
    public Driver(float Salary)
    {
        _salary = Salary;
    } 
    public override float Salary { get { return _salary; } } 
    //for testing i just hard coded '3000' value
   }

}

public abstract class Bonus : Worker
{
    public Bonus(Worker worker) => this.worker = worker; 
    protected Worker worker { get; private set; }
}

public class AmountBonus : Bonus
{
    public AmountBonus(Worker worker) : base(worker: worker) { }
    public override float Salary
    {
        get
        {
            return worker.Salary +200;
        }
    }

}


  static void Main(string[] args)
    {
        var driver = new Driver(3200);

        Console.WriteLine(driver.Salary);
        var driverSalWithBonus = new AmountBonus(driver);
        Console.WriteLine(driverSalWithBonus.Salary);
        Console.ReadLine();
    }

Тогда основной проблемой в вашем коде было то, что метод CountSalary нигде не вызывался и его не нужно. Вторая проблема заключалась в том, что зарплата должна быть абстрактной, чтобы ее можно было перезаписать в дочерних классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...