Модель локализации/делегирования
Модель локализации/делегирования
Как уже отмечалось в этой главе, наследование можно реализовать двумя способами. Только что мы исследовали классическое отношение подчиненности ("is-a"). Чтобы завершить обсуждение второго принципа ООП, давайте рассмотрим отношение локализации (отношение "has-a", также известное под названием модели локализации/делегирования). Предположим, что мы создали новый класс, моделирующий пакет льгот работника.
// Этот тип будет функционировать, как вложенный класс.
public class BenefitPackage {
// Другие члены, представляющие пакет страховок,
// медицинского обслуживания и т.д.
public double ComputePayDeduction() {return 125.0;}
}
Ясно, что отношение подчиненности ("is-a") между типами BenefitPackage (пакет льгот) и Employee (работник) выглядело бы достаточно странно. (Является ли менеджер пакетом льгот? Вряд ли.) Но должно быть ясно и то, что какая-то связь между этими типами необходима. Короче, вы должны выразить ту идею, что каждый работник имеет ("has-a") пакет льгот. Для этого определение класса Employee следует обновить так", как показано ниже.
// Работники теперь имеют льготы.
public class Employee {
…
// Содержит объект BenefitPackage.
protected BenefitPackage empBenefits = new BenefitPackage();
}
Здесь вы успешно создали вложенный объект. Но чтобы открыть функциональные возможности вложенного объекта внешнему миру, требуется делегирование. Делегирование означает добавление в класс-контейнер таких членов, которые будут использовать функциональные возможности содержащегося в классе объекта. Например, можно изменить класс Employee так, чтобы он открывал содержащийся в нем объект empBenefits с помощью некоторого свойства, а также позволял использовать функциональные возможности этого объекта с помощью нового метода GetBenefitCost().
public class Employee {
protected BenefitPackage empBenefits = new BenefitPackage();
// Открытие некоторых функциональных возможностей объекта.
public double GetBenefitCost() {
return empBenefits.ComputePayDeduction();
}
// Доступ к объекту через пользовательское свойство.
public BenefitPackage Benefits {
get {return empBenefits;}
set {empBenefits = value;}
}
}
В следующем обновленном методе Main() обратите внимание на то, как можно взаимодействовать с внутренним типом BenefitsPackage, определяемым типом Employee.
static void Main(string[] args) {
Manager mel;
mel = new Manager();
Console.WriteLine (mel.Benefits.ComputerPayDeduction());
…
Consolе.ReadLine();
}