Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 135 136 137 138 139 140 141 142 143 ... 642
Перейти на страницу:

  ...

}

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

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

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

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

chucky.GiveBonus(300);

chucky.DisplayStats();

Console.WriteLine();

SalesPerson fran = new SalesPerson(&quot;Fran&quot;, 43, 93, 3000, &quot;932-32-3232&quot;, 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):

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

using System;

class SalesPerson : Employee

{

  ...

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

  public override void GiveBonus(float amount)

  {

    int salesBonus = 0;

    if (SalesNumber &gt;= 0 &amp;&amp; SalesNumber &lt;= 100)

      salesBonus = 10;

    else

    {

      if (SalesNumber &gt;= 101 &amp;&amp; SalesNumber &lt;= 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(&quot;Name: {0}&quot;, Name);

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

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

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

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

}

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

1 ... 135 136 137 138 139 140 141 142 143 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга