Получить ссылку на объект из базового класса. Шаблон оформления декоратора - PullRequest
0 голосов
/ 08 января 2019

Я имею дело с Шаблон оформления декоратора . Что я получил сейчас:

Моя база 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;
}

У меня вопрос, как получить ссылку на объект Worker worker в базовом классе (Bonus) в классе конкретного декоратора как AmountBonus?

EDIT

Основываясь на вашей помощи, могу ли я удалить private Worker worker из AmountBonus класса и играть с worker из базового Bonus класса, как base.worker? Возможно ли это?

enter image description here

VS не сказал мне, что не разрешено

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

1 Ответ

0 голосов
/ 08 января 2019

Превратив private Worker worker { get; set; } в protected Worker worker { get; set; } классы снаружи, вы не сможете получить к нему доступ, но базовые классы смогут. Это работает, даже если базовый класс abstract

Редактировать: Это также хорошее время, чтобы узнать о соглашениях по именованию в C #;) Документы MSDN
Редактировать 2: Поскольку этот комментарий указывает на то, что вы, вероятно, захотите использовать private set с вашим Worker worker

Редактировать после вопроса Редактировать: Вам все еще (только если вы хотите) нужен работник в классе Bonus, но вам не нужно снова объявлять private Worker worker;, как это (правильно указано intellisense) скрывает Bonus.worker рабочий. Если Bonus.Worker установлен как защищенный, а не как частный, вы можете использовать его из ваших унаследованных классов, не объявляя его снова. Это будет результат:

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();
    }
}
...