Прежде чем приступать к построению каких-то производных классов, следует уделить внимание одной детали. Поскольку первоначальный класс Employee
EmployeeApp
, он находится внутри идентично названного пространства имен .NET Core. Пространства имен подробно рассматриваются в главе 16; тем не менее, ради простоты переименуйте текущее пространство имен (в обоих файлах) на Employees
, чтобы оно совпадало с именем нового проекта:// Не забудьте изменить название пространства имен в обоих файлах С#!
namespace Employees
{
partial class Employee
{...}
}
На заметку!
Если вы удалили стандартный конструктор во время внесения изменений в код классаEmployee
в главе 5, тогда снова добавьте его в класс.Вторая деталь касается удаления любого закомментированного кода из различных итераций класса Employee
На заметку!
В качестве проверки работоспособности скомпилируйте и запустите новый проект, введяdotnet run
в окне командной подсказки (в каталоге проекта) или нажав <Ctrl+F5> в случае использования Visual Studio. Пока что программа ничего не делает, но это позволит удостовериться в отсутствии ошибок на этапе компиляции.Цель в том, чтобы создать семейство классов, моделирующих разнообразные типы сотрудников в компании. Предположим, что необходимо задействовать функциональность класса Employee
SalesPerson
и Manager
). Новый класс SalesPerson
"является" Employee
(как и Manager
). Вспомните, что в модели классического наследования базовые классы (вроде Employee
) обычно применяются для определения характеристик, общих для всех наследников. Подклассы (такие как SalesPerson
и Manager
) расширяют общую функциональность, добавляя к ней специфическую функциональность.В настоящем примере мы будем считать, что класс Manager
Employee
, сохраняя количество фондовых опционов, тогда как класс SalesPerson
поддерживает хранение количества продаж. Добавьте новый файл класса (Manager.cs
), в котором определен класс Manager
со следующим автоматическим свойством:// Менеджерам нужно знать количество их фондовых опционов.
class Manager : Employee
{
public int StockOptions { get; set; }
}
Затем добавьте еще один новый файл класса (SalesPerson.cs
SalesPerson
с подходящим автоматическим свойством:// Продавцам нужно знать количество продаж.
class SalesPerson : Employee
{
public int SalesNumber { get; set; }
}
После того как отношение "является" установлено, классы SalesPerson
Manager
автоматически наследуют все открытые члены базового класса Employee
. В целях иллюстрации обновите операторы верхнего уровня, как показано ниже:// Создание объекта подкласса и доступ к функциональности базового класса.
Console.WriteLine("***** The Employee Class Hierarchy *****\n");
SalesPerson fred = new SalesPerson
{
Age = 31, Name = "Fred", SalesNumber = 50
};
Вызов конструкторов базового класса с помощью ключевого слова base
В текущий момент объекты классов SalesPerson
Manager
могут создаваться только с использованием "бесплатно полученного" стандартного конструктора (см. главу 5). Памятуя о данном факте, предположим, что в класс Manager
добавлен новый конструктор с шестью аргументами, который вызывается следующим образом:...
// Предположим, что у Manager есть конструктор с такой сигнатурой:
// (string fullName, int age, int empId,
// float currPay, string ssn, int numbOfOpts)
Manager chucky = new Manager("Chucky", 50, 92, 100000, "333-23-2322", 9000);
Взглянув на список параметров, легко заметить, что большинство аргументов должно быть сохранено в переменных-членах, определенных в базовом классе Employee
Manager
можно было бы реализовать показанный ниже специальный конструктор:public Manager(string fullName, int age, int empId,