Язык C# предлагает еще одно ключевое слово, sealed
sealed
(запечатанный), компилятор не позволяет создавать классы, производные от него. Например, пусть вы приняли решение о том, что дальнейшее расширение класса MiniVan
не имеет смысла:// Класс Minivan не может быть расширен!
sealed class MiniVan : Car
{
}
Если вы или ваш коллега попытаетесь унаследовать от запечатанного класса MiniVan
// Ошибка! Нельзя расширять класс, помеченный ключевым словом sealed!
class DeluxeMiniVan
: MiniVan
{
}
Запечатывание класса чаще всего имеет наибольший смысл при проектировании обслуживающего класса. Скажем, в пространстве имен System
String
. Таким образом, как и в случае MiniVan
, если вы попытаетесь построить новый класс, который расширял бы System.String
, то получите ошибку на этапе компиляции:// Еще одна ошибка! Нельзя расширять класс, помеченный как sealed!
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
(Детали класса).При желании можете свободно использовать указанные визуальные инструменты во время проработки оставшихся глав книги. Однако всегда анализируйте сгенерированный код, чтобы четко понимать, что эти инструменты для вас сделали.
Второй принцип объектно-ориентированного программирования: детали наследования
Теперь, когда вы видели базовый синтаксис наследования, давайте построим более сложный пример и рассмотрим многочисленные детали построения иерархий классов. Мы снова обратимся к классу Employee
Employees
.Далее скопируйте в проект Employees
Employee.cs
, Employee.Core.cs
и EmployeePayTypeEnum.cs
, созданные ранее в проекте EmployeeApp
из главы 5.На заметку!
До выхода .NET Core, чтобы использовать файлы в проекте С#, на них необходимо было ссылаться в файле.csproj
. В версии .NET Core все файлы из текущей структуры каталогов автоматически включаются в проект. Простого копирования нескольких файлов из другого проекта достаточно для их включения в ваш проект.