Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 139
- Предыдущая
- 139/642
- Следующая
...}Поскольку метод
GiveBonus()publicConsole.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
Полиморфизм предоставляет подклассу способ определения собственной версии метода, определенного в его базовом классе, с применением процесса, который называется переопределением метода. Чтобы модернизировать текущее проектное решение, необходимо понимать смысл ключевых слов
virtualoverridevirtualpartial class Employee{ // Теперь этот метод может быть переопределен в производном классе. public virtual void GiveBonus(float amount) { Pay += amount; } ...}На заметку! Методы, помеченные ключевым словом
virtualКогда подкласс желает изменить реализацию деталей виртуального метода, он прибегает к помощи ключевого слова
overrideSalesPersonManagerGiveBonus()PtSalesPersonGiveBonus()SalesPersonusing 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()Employeepublic 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()ManagerSalesPersonDisplayStats()- Предыдущая
- 139/642
- Следующая
