Язык программирования C#9 и платформа .NET5
class MyString: String{}На заметку! В главе 4 вы узнали о том, что структуры C# всегда неявно запечатаны (см. табл. 4.3). Следовательно, создать структуру, производную от другой структуры, класс, производный от структуры, или структуру, производную от класса, невозможно. Структуры могут применяться для моделирования только отдельных, атомарных, определяемых пользователем типов. Если вы хотите задействовать отношение "является", тогда должны использовать классы.
Нетрудно догадаться, что есть многие другие детали наследования, о которых вы узнаете в оставшемся материале главы. Пока просто примите к сведению, что операция двоеточия позволяет устанавливать отношения "базовый-производный" между классами, а ключевое слово
предотвращает последующее наследование.sealedЕще раз о диаграммах классов Visual Studio
В главе 2 кратко упоминалось о том, что среда Visual Studio позволяет устанавливать отношения "базовый-производный" между классами визуальным образом во время проектирования. Для работы с указанным аспектом IDE-среды сначала понадобится добавить в текущий проект новый файл диаграммы классов. Выберите пункт меню Project►Add New Item (Проект►Добавить новый элемент) и щелкните на значке Class Diagram (Диаграмма классов); на рис. 6.1 видно, что файл был переименован с
наClassDiagraml.cd.Cars.cdПосле щелчка на кнопке Add (Добавить) отобразится пустая поверхность проектирования. Чтобы добавить типы в визуальный конструктор классов, просто перетаскивайте на эту поверхность каждый файл из окна Solution Explorer (Проводник решений). Также вспомните, что удаление элемента из визуального конструктора (путем его выбора и нажатия клавиши <Delete>) не приводит к уничтожению ассоциированного с ним исходного кода, а просто убирает элемент из поверхности конструктора. Текущая иерархия классов показана на рис. 6.2.
Как говорилось в главе 2. помимо простого отображения отношений между типами внутри текущего приложения можно также создавать новые типы и наполнять их членами, применяя панель инструментов конструктора классов и окно Class Details (Детали класса).
При желании можете свободно использовать указанные визуальные инструменты во время проработки оставшихся глав книги. Однако всегда анализируйте сгенерированный код, чтобы четко понимать, что эти инструменты для вас сделали.
Второй принцип объектно-ориентированного программирования: детали наследования
Теперь, когда вы видели базовый синтаксис наследования, давайте построим более сложный пример и рассмотрим многочисленные детали построения иерархий классов. Мы снова обратимся к классу
, который был спроектирован в главе 5. Первым делом создайте новый проект консольного приложения C# по имениEmployee.EmployeesДалее скопируйте в проект
файлыEmployees,Employee.csиEmployee.Core.cs, созданные ранее в проектеEmployeePayTypeEnum.csиз главы 5.EmployeeAppНа заметку! До выхода .NET Core, чтобы использовать файлы в проекте С#, на них необходимо было ссылаться в файле
. В версии .NET Core все файлы из текущей структуры каталогов автоматически включаются в проект. Простого копирования нескольких файлов из другого проекта достаточно для их включения в ваш проект..csprojПрежде чем приступать к построению каких-то производных классов, следует уделить внимание одной детали. Поскольку первоначальный класс
был создан в проекте по имениEmployee, он находится внутри идентично названного пространства имен .NET Core. Пространства имен подробно рассматриваются в главе 16; тем не менее, ради простоты переименуйте текущее пространство имен (в обоих файлах) наEmployeeApp, чтобы оно совпадало с именем нового проекта:Employees// Не забудьте изменить название пространства имен в обоих файлах С#!namespace Employees{partial class Employee{...}}На заметку! Если вы удалили стандартный конструктор во время внесения изменений в код класса
в главе 5, тогда снова добавьте его в класс.EmployeeВторая деталь касается удаления любого закомментированного кода из различных итераций класса
, рассмотренных в примере главы 5.EmployeeНа заметку! В качестве проверки работоспособности скомпилируйте и запустите новый проект, введя
в окне командной подсказки (в каталоге проекта) или нажав <Ctrl+F5> в случае использования Visual Studio. Пока что программа ничего не делает, но это позволит удостовериться в отсутствии ошибок на этапе компиляции.dotnet runЦель в том, чтобы создать семейство классов, моделирующих разнообразные типы сотрудников в компании. Предположим, что необходимо задействовать функциональность класса
при создании двух новых классов (EmployeeиSalesPerson). Новый классManager"является"SalesPerson(как иEmployee). Вспомните, что в модели классического наследования базовые классы (вродеManager) обычно применяются для определения характеристик, общих для всех наследников. Подклассы (такие какEmployeeиSalesPerson) расширяют общую функциональность, добавляя к ней специфическую функциональность.ManagerВ настоящем примере мы будем считать, что класс
расширяетManager, сохраняя количество фондовых опционов, тогда как классEmployeeподдерживает хранение количества продаж. Добавьте новый файл класса (SalesPerson), в котором определен классManager.csсо следующим автоматическим свойством:Manager// Менеджерам нужно знать количество их фондовых опционов.

