从基 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 里面是什么。如果你愿意,我会把它添加到我的编辑中。
接下来我开始实现我的装饰器。每个 Worker
有 CountSalary()
。我想根据装饰者的工资申请奖金。
我们开始于 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();
}
}
我正在处理 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 里面是什么。如果你愿意,我会把它添加到我的编辑中。
接下来我开始实现我的装饰器。每个 Worker
有 CountSalary()
。我想根据装饰者的工资申请奖金。
我们开始于 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();
}
}