Mir-knigi.online
Книги онлайн читать бесплатно!
  • Главная
  • Жанры
  • ТОП книг
  • ТОП авторов
  • Контакты

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

Часть 137 из 642 Информация о книге

Добавьте к операторам верхнего уровня показанный ниже код, с помощью которого можно подтвердить то, что вам уже известно: позиционные типы записей работают точно так же, как типы записей.

PositionalCar pc = new PositionalCar("Honda", "Pilot", "Blue");

PositionalMiniVan pm = new PositionalMiniVan("Honda", "Pilot", "Blue", 10);

Console.WriteLine($"Checking PositionalMiniVan is-a PositionalCar:

  {pm is PositionalCar}");

Эквивалентность с унаследованными типами записей

Вспомните из главы 5, что для определения эквивалентности типы записей используют семантику значений. Еще одна деталь относительно типов записей связана с тем, что тип записи является частью соображения, касающегося эквивалентности. Скажем, взгляните на следующие тривиальные примеры:

public record MotorCycle(string Make, string Model);

public record Scooter(string Make, string Model) : MotorCycle(Make,Model);

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

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);


Перейти к странице:
Предыдущая страница
Следующая страница
Жанры
  • Военное дело
  • Деловая литература
  • Детективы и триллеры
  • Детские
  • Детские книги
  • Документальная литература
  • Дом и дача
  • Дом и Семья
  • Жанр не определен
  • Зарубежная литература
  • Знания и навыки
  • История
  • Компьютеры и Интернет
  • Легкое чтение
  • Любовные романы
  • Научно-образовательная
  • Образование
  • Поэзия и драматургия
  • Приключения
  • Проза
  • Прочее
  • Психология и мотивация
  • Публицистика и периодические издания
  • Религия и духовность
  • Родителям
  • Серьезное чтение
  • Спорт, здоровье и красота
  • Справочная литература
  • Старинная литература
  • Техника
  • Фантастика и фентези
  • Фольклор
  • Хобби и досуг
  • Юмор
Mir-knigi.online

Бесплатная онлайн библиотека для чтения книг без регистрации с телефона или компьютера. У нас собраны последние новинки, мировые бестселлеры книжного мира.

Контакты
  • [email protected]
Информация
  • Карта сайта
© mir-knigi.online, 2026. | Вход