从基 class 获取对对象的引用。装饰器设计模式

Get reference to object from base class. Decorator design pattern

我正在处理 Decorator design pattern。我现在得到的是:

我的基地abstract class Worker:

public abstract class Worker
{
    public float UsdPerHour { get; set; }
    public int HoursPerDay { get; set; }
    public int DaysOfWork { get; set; }

    public abstract float CountSalary();
}

它很抽象,因为它是我 Workers classes 的基础。我认为这不是必需的,classes 里面是什么。如果你愿意,我会把它添加到我的编辑中。

接下来我开始实现我的装饰器。每个 WorkerCountSalary()。我想根据装饰者的工资申请奖金。

我们开始于 abstract Bonus class:

public abstract class Bonus : Worker
{
    public Bonus(Worker worker) => this.worker = worker;
    public override float CountSalary() => worker.CountSalary();

    private Worker worker { get; set; }
}

奖金是 AmountBonus class.

的基础等级
public class AmountBonus : Bonus
{
    public AmountBonus(Worker worker) : base(worker: worker){ }
    // is this 'base' call correct?

    public override float CountSalary()
    {
        throw new NotImplementedException();
    }

    private Worker worker;
}

我的问题是,如何在具体装饰器 class 中获取对基 class (Bonus) 中对象 Worker worker 的引用作为 AmountBonus

编辑

根据你的帮助,我可以从 AmountBonus class 中删除 private Worker worker,然后从基础 Bonus class 中玩 worker喜欢 base.worker?可能吗?

VS 没告诉我,那是不允许的

public override float CountSalary() => base.worker.CountSalary();

通过将你的 private Worker worker { get; set; } 变成 protected Worker worker { get; set; } classes 外部无法访问它,但基础 classes 可以。即使基数 class 是 abstract

这也有效

编辑:这也是学习 C# 命名约定的好时机 ;) MSDN docs
编辑 2: 正如 评论指出的那样,您可能希望在 Worker worker

中使用 private set

在问题编辑后编辑:您仍然(仅当您需要时)需要 Bonus class 中的工人,但您不需要声明private Worker worker; 再次,因为这(智能感知正确指出)隐藏了 Bonus.worker 工人。如果 Bonus.Worker 设置为受保护的,而不是私有的,您可以从继承的 classes 中使用它,而无需再次声明它。这将是结果:

public abstract class Worker
{
    public float UsdPerHour { get; set; }
    public int HoursPerDay { get; set; }
    public int DaysOfWork { get; set; }

    public abstract float CountSalary();
}

public abstract class Bonus : Worker
{
    public Bonus(Worker worker) => this.worker = worker;
    public override float CountSalary() => worker.CountSalary();

    protected Worker worker { get; private set; }
}

public class AmountBonus : Bonus
{
    public AmountBonus(Worker worker) : base(worker: worker){ }

    public override float CountSalary()
    {
        throw new NotImplementedException();
    }
}