}
// Другие члены…
}
Поскольку класс PTSalesPerson изолирован, он не может служить базовым Классам никакому другому типу. Поэтому при попытке расширить PTSalesPersоn вы получите сообщение об ошибке компиляции.
// Ошибка компиляции!
public class ReallyPTSalesPerson: PTSalesPerson {…}
Наиболее полезным ключевое слово sealed оказывается при создании автономных классов утилит. Класс String, определённый в пространстве имен Sуstem, например, явно изолирован.
public sealed class string: object, IComparable, ICloneable, IConvertible, IEnumerable {…}
Поэтому вы не сможете создать новый класс, производный от System.String:
// Снова ошибка!
public class MyString: string
Если вы хотите создать новый класс, использующий функциональные возможности изолированного класса, единственным вариантом будет отказ от классического наследования и использование модели локализации/делегирования (известной еще как отношение локализации, "has-a").
Модель локализации/делегирования
Как уже отмечалось в этой главе, наследование можно реализовать двумя способами. Только что мы исследовали классическое отношение подчиненности ("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();
}
Здесь вы успешно создали вложенный объект. Но чтобы открыть функциональные возможности вложенного объекта внешнему миру, требуется
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();
}
Вложенные определения типов