簡體   English   中英

從基類獲取對對象的引用。 裝飾設計模式

[英]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 workerAmountBonus類,並與發揮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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM