Читаем Язык программирования C#9 и платформа .NET5 полностью

Игнорируя тот факт, что унаследованные классы обычно расширяют базовые классы, в приведенных простых примерах определяются два разных типа записей, которые имеют те же самые свойства. В случае создания экземпляров с одинаковыми значениями для свойств они не пройдут проверку на предмет эквивалентности из-за того, что принадлежат разным типам. В качестве примера рассмотрим показанный далее код и результаты его выполнения:


MotorCycle mc = new MotorCycle("Harley","Lowrider");

Scooter sc = new Scooter("Harley", "Lowrider");

Console.WriteLine($"MotorCycle and Scooter are equal: {Equals(mc,sc)}");


Вот вывод:


Record type inheritance!

MotorCycle and Scooter are equal: False

Реализация модели включения/делегации

Вам уже известно, что повторное использование кода встречается в двух видах. Только что было продемонстрировано классическое отношение "является". Перед тем, как мы начнем исследование третьего принципа ООП (полиморфизма), давайте взглянем на отношение "имеет" (также известное как модель включения/делегации или агрегация). Возвратитесь к проекту Employees и создайте новый файл по имени BenefitPackage.cs. Поместите в него следующий код, моделирующий пакет льгот для сотрудников:


namespace Employees

{

  // Этот новый тип будет функционировать как включаемый класс.

  class BenefitPackage

  {

    // Предположим, что есть другие члены, представляющие

    // медицинские/стоматологические программы и т.п.


    public double ComputePayDeduction

    {

      return 125.0;

    }

  }

}


Очевидно, что было бы довольно странно устанавливать отношение "является" между классом BenefitPackage и типами сотрудников. (Разве сотрудник "является" пакетом льгот? Вряд ли.) Однако должно быть ясно, что какое-то отношение между ними должно быть установлено. Короче говоря, нужно выразить идею о том, что каждый сотрудник "имеет" пакет льгот. Для этого можно модифицировать определение класса Employee следующим образом:


// Теперь сотрудники имеют льготы.

partial class Employee

{

  // Contain a BenefitPackage object.

  protected BenefitPackage EmpBenefits = new BenefitPackage;

...

}


На данной стадии вы имеете объект, который благополучно содержит в себе другой объект. Тем не менее, открытие доступа к функциональности содержащегося объекта внешнему миру требует делегации. Делегация — просто действие по добавлению во включающий класс открытых членов, которые работают с функциональностью содержащегося внутри объекта.

Например, вы могли бы изменить класс Employee так, чтобы он открывал доступ к включенному объекту EmpBenefits с применением специального свойства, а также использовать его функциональность внутренне посредством нового метода по имени GetBenefitCost:


partial class Employee

{

  // Содержит объект BenefitPackage.

  protected BenefitPackage EmpBenefits = new BenefitPackage;


  // Открывает доступ к некоторому поведению, связанному со льготами.

  public double GetBenefitCost

     => EmpBenefits.ComputePayDeduction;


  // Открывает доступ к объекту через специальное свойство.

  public BenefitPackage Benefits

  {

    get { return EmpBenefits; }

    set { EmpBenefits = value; }

  }

}


В показанном ниже обновленном коде верхнего уровня обратите внимание на взаимодействие с внутренним типом BenefitsPackage, который определен в типе Employee:


Console.WriteLine("***** The Employee Class Hierarchy *****\n");

...

Manager chucky = new Manager("Chucky", 50, 92, 100000, "333-23-2322", 9000);

double cost = chucky.GetBenefitCost;

Console.WriteLine($"Benefit Cost: {cost}");

Console.ReadLine;

Определения вложенных типов

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT