KnigkinDom.org» » »📕 Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

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

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

1 ... 87 88 89 90 91 92 93 94 95 ... 407
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
ключевыми словами (и концепциями), которые позволяют строить иерархии типов, связанных посредством классического наследования, включения и вложения. Не беспокойтесь, если пока еще не все детали ясны. На протяжении оставшихся глав книги будет построено немало иерархий. А теперь давайте перейдем к исследованию последнего принципа ООП — полиморфизма.

Третий принцип объектно-ориентированного программирования: поддержка полиморфизма в C#

Вспомните, что в базовом классе Employee определен метод по имени GiveBonus(), который первоначально был реализован так (до его обновления с целью использования шаблона свойств):

public partial class Employee

{

  public void GiveBonus(float amount) => _currPay += amount;

  ...

}

Поскольку метод GiveBonus() был определен с ключевым словом public, бонусы можно раздавать продавцам и менеджерам (а также продавцам с частичной занятостью):

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

// Выдать каждому сотруднику бонус?

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

chucky.GiveBonus(300);

chucky.DisplayStats();

Console.WriteLine();

SalesPerson fran = new SalesPerson("Fran", 43, 93, 3000, "932-32-3232", 31);

fran.GiveBonus(200);

fran.DisplayStats();

Console.ReadLine();

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

Использование ключевых слов virtual и override

Полиморфизм предоставляет подклассу способ определения собственной версии метода, определенного в его базовом классе, с применением процесса, который называется переопределением метода. Чтобы модернизировать текущее проектное решение, необходимо понимать смысл ключевых слов virtual и override. Если базовый класс желает определить метод, который может быть (но не обязательно) переопределен в подклассе, то он должен пометить его ключевым словом virtual:

partial class Employee

{

  // Теперь этот метод может быть переопределен в производном классе.

  public virtual void GiveBonus(float amount)

  {

    Pay += amount;

  }

  ...

}

На заметку! Методы, помеченные ключевым словом virtual, называются виртуальными методами.

Когда подкласс желает изменить реализацию деталей виртуального метода, он прибегает к помощи ключевого слова override. Например, классы SalesPerson и Manager могли бы переопределять метод GiveBonus(), как показано ниже (предположим, что класс PtSalesPerson не будет переопределять GiveBonus(), а потому просто наследует его версию из SalesPerson):

using System;

class SalesPerson : Employee

{

  ...

  // Бонус продавца зависит от количества продаж.

  public override void GiveBonus(float amount)

  {

    int salesBonus = 0;

    if (SalesNumber >= 0 && SalesNumber <= 100)

      salesBonus = 10;

    else

    {

      if (SalesNumber >= 101 && SalesNumber <= 200)

        salesBonus = 15;

      else

        salesBonus = 20;

    }

    base.GiveBonus(amount * salesBonus);

  }

}

class Manager : Employee

{

  ...

  public override void GiveBonus(float amount)

  {

    base.GiveBonus(amount);

    Random r = new Random();

    StockOptions += r.Next(500);

  }

}

Обратите внимание, что каждый переопределенный метод может задействовать стандартное поведение посредством ключевого слова base.

Таким образом, полностью повторять реализацию логики метода GiveBonus() вовсе не обязательно, а взамен можно повторно использовать (и расширять) стандартное поведение родительского класса.

Также предположим, что текущий метод DisplayStats() класса Employee объявлен виртуальным:

public virtual void DisplayStats()

{

    Console.WriteLine("Name: {0}", Name);

    Console.WriteLine("Id: {0}", Id);

    Console.WriteLine("Age: {0}", Age);

    Console.WriteLine("Pay: {0}", Pay);

    Console.WriteLine("SSN: {0}", SocialSecurityNumber);

}

Тогда каждый подкласс может переопределять метод DisplayStats() с целью отображения количества продаж (для продавцов) и текущих фондовых опционов (для менеджеров). Например, рассмотрим версию метода DisplayStats() из класса Manager (класс SalesPerson реализовывал бы метод DisplayStats() в похожей манере, выводя на консоль количество продаж):

// Manager.cs

public override void DisplayStats()

{

  base.DisplayStats();

  // Вывод количества фондовых опционов

  Console.WriteLine("Number of Stock Options: {0}", StockOptions);

}

// SalesPerson.cs

public override void DisplayStats()

{

  base.DisplayStats();

  // Вывод количества продаж

  Console.WriteLine("Number of Sales: {0}", SalesNumber);

}

Теперь, когда каждый подкласс может истолковывать эти виртуальные методы значащим для него образом, их экземпляры ведут себя как более независимые сущности:

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

// Лучшая система бонусов!

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

chucky.GiveBonus(300);

chucky.DisplayStats();

Console.WriteLine();

SalesPerson fran = new SalesPerson("Fran", 43, 93, 3000, "932-32-3232", 31);

fran.GiveBonus(200);

fran.DisplayStats();

Console.ReadLine();

Вот результат тестового запуска приложения в его текущем виде:

***** The Employee Class Hierarchy *****

Name: Chucky

ID: 92

Age: 50

Pay: 100300

SSN: 333-23-2322

Number of Stock Options: 9337

Name: Fran

ID: 93

Age: 43

Pay: 5000

SSN: 932-32-3232

Number of Sales: 31

Переопределение виртуальных членов с помощью Visual Studio/Visual Studio Code

Вы наверняка заметили, что при переопределении члена класса приходится вспоминать тип каждого параметра, не говоря уже об имени метода и соглашениях по передаче параметров (ref, out и params). В Visual Studio и Visual Studio Code доступно полезное средство IntelliSense, к которому можно обращаться при переопределении виртуального члена. Если вы наберете слово override внутри области действия типа класса (и затем нажмете клавишу пробела), то IntelliSense автоматически отобразит список всех допускающих переопределение членов родительского класса, исключая уже переопределенные методы.

Если вы выберете член и нажмете клавишу <Enter>,

1 ... 87 88 89 90 91 92 93 94 95 ... 407
Перейти на страницу:
Отзывы - 0

Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.


Партнер

Новые отзывы

  1. Гость Татьяна Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
  2. Римма Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
  3. Римма Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова
Все комметарии
Новое в блоге