Процесс вложения может распространяться настолько "глубоко", насколько требуется. Например, пусть необходимо создать перечисление по имени BenefitPackageLevel
Employee
, BenefitPackage
и BenefitPackageLevel
, перечисление можно вложить следующим образом:// В класс Employee вложен класс BenefitPackage.
public partial class Employee
{
// В класс BenefitPackage вложено перечисление BenefitPackageLevel.
public class BenefitPackage
{
public enum BenefitPackageLevel
{
Standard, Gold, Platinum
}
public double ComputePayDeduction()
{
return 125.0;
}
}
...
}
Вот как приходится использовать перечисление BenefitPackageLevel
...
// Определить уровень льгот.
Employee.BenefitPackage.BenefitPackageLevel myBenefitLevel =
Employee.BenefitPackage.BenefitPackageLevel.Platinum;
Итак, к настоящему моменту вы ознакомились с несколькими ключевыми словами (и концепциями), которые позволяют строить иерархии типов, связанных посредством классического наследования, включения и вложения. Не беспокойтесь, если пока еще не все детали ясны. На протяжении оставшихся глав книги будет построено немало иерархий. А теперь давайте перейдем к исследованию последнего принципа ООП — полиморфизма.
Третий принцип объектно-ориентированного программирования: поддержка полиморфизма в 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
, называются виртуальными методами.