代码之家  ›  专栏  ›  技术社区  ›  michasaucer

具有抽象性的装饰者,不能正确获得装饰值

  •  2
  • michasaucer  · 技术社区  · 7 年前

    我正在努力 Decorator Design Pattern 这就是我得到的:

    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 回复  |  直到 7 年前
        1
  •  1
  •   Gaurav    7 年前

    我已对您的代码进行了一些修改:

     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方法没有在任何地方调用,也不是必需的。第二个问题是工资应该抽象,以便可以在子类中覆盖它。