[英]Get reference to object from base class. 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
類的基礎。 我認為這不是必需的,那一類是什么。 如果您願意,我會將其添加到我的編輯中。
接下來,我開始實現我的裝飾器。 每個Worker
都有CountSalary()
。 我想根據裝修員將獎金應用到他們的工資中。
我們從abstract Bonus
類開始:
public abstract class Bonus : Worker
{
public Bonus(Worker worker) => this.worker = worker;
public override float CountSalary() => worker.CountSalary();
private Worker worker { get; set; }
}
獎金是AmountBonus
類的基本要求。
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;
}
我的問題是,如何在具體裝飾器類的基類( Bonus
)中將對象Worker worker
引用為AmountBonus
?
編輯
根據您的幫助,我可以刪除private Worker worker
從AmountBonus
類,並與發揮worker
從基本Bonus
類像base.worker
? 可能嗎?
VS沒有告訴我,這是不允許的
public override float CountSalary() => base.worker.CountSalary();
通過轉向您的private Worker worker { get; set; }
private Worker worker { get; set; }
private Worker worker { get; set; }
進入protected Worker worker { get; set; }
protected Worker worker { get; set; }
protected Worker worker { get; set; }
外部的類無法訪問它,但是基類可以訪問它。 即使基類是abstract
此方法也有效
編輯:這也是學習C#命名約定的好時機;) MSDN文檔
編輯2:正 如此評論所指出的那樣,您可能想對Worker worker
使用private set
問題后編輯編輯:您仍然(僅在需要時)需要Bonus
類中的Worker,但無需聲明private Worker worker;
再次(正如intellisense正確指出的那樣)隱藏了Bonus.worker
工作者。 如果Bonus.Worker
設置為protected(而非私有),則可以從繼承的類中使用它,而無需再次聲明。 結果將是:
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.