Прежде чем приступать к построению каких-то производных классов, следует уделить внимание одной детали. Поскольку первоначальный класс Employee был создан в проекте по имени EmployeeApp, он находится внутри идентично названного пространства имен .NET Core. Пространства имен подробно рассматриваются в главе 16; тем не менее, ради простоты переименуйте текущее пространство имен (в обоих файлах) на Employees, чтобы оно совпадало с именем нового проекта:

// Не забудьте изменить название пространства имен в обоих файлах С#!

namespace Employees

{

  partial class Employee

  {...}

}

На заметку! Если вы удалили стандартный конструктор во время внесения изменений в код класса Employee в главе 5, тогда снова добавьте его в класс.

Вторая деталь касается удаления любого закомментированного кода из различных итераций класса Employee, рассмотренных в примере главы 5.

На заметку! В качестве проверки работоспособности скомпилируйте и запустите новый проект, введя 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

};

<p id="AutBody_Root266">Вызов конструкторов базового класса с помощью ключевого слова base</p>

В текущий момент объекты классов 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,

Перейти на страницу:

Похожие книги