Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 139
- Предыдущая
- 139/642
- Следующая
...
}
Поскольку метод
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()
- Предыдущая
- 139/642
- Следующая