Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

13.7. Опечатанные классы и методы

C# разрешает определять методы, свойства и классы, для которых невозможно

наследование. В объявление такого метода, свойства или класса входит

модификатор sealed "модификатор: sealed" (опечатанный, герметизированный).

Опечатанный класс "опечатанный класс" нельзя использовать в качестве базовог

о

класса. Опечатанный метод "метод:опечатанный метод" и опечатанное свойство

"опечатанное свойство" при наследовании нельзя переопределить.

В базовой библиотеке классов .NET Framework много опечатанных классов.

Программисты, работающие с библиотекой в качестве пользователей, не могут

создавать собственные производные классы на основе опечатанных классов .NET

Framework. Таким опечатанным библиотечным классом является класс string.

13.8. Применение абстрактых классов

Мы уже отметили, что нельзя создать объект абстрактного класса. Однако,

можно объявить ссылку с типом абстрактного класса. Такая ссылка может служить

параметром метода и возвращаемым значением метода. В обоих случаях ссылка

представляет объект того конкретного класса, который является производным от

абстрактного.

В качестве примера обратимся ещё раз к абстрактному классу Figure и

производным от него классам Rectangle и Triangle. В этих классах определены

методы square(), возвращающие значения площадей объектов конкретных классов

(не абстрактных). Следующий метод позволяет вывести значение любого объекта

классов Triangle и Rectangle (программа 13_13.cs).

static void figSq(Figure f)

{ Console.WriteLine("Площадь = " + f.square()); }

Можно определять массивы ссылок с типами абстрактных классов.

Значениями этих ссылок должны быть "адреса" объектов конкретных классов,

реализующих базовый. Следующий метод возвращает ссылку с типом абстрактного

класса:

static Figure figRec(Figure[] ar, int n)

{ return ar[n]; }

Параметры метода – ссылка на массив ссылок с типом Figure и целое n,

определяющее индекс элемента этого массива. Возвращаемое значение метода –

значение элемента массива. При обращении к методу в качестве аргумента

используется ссылка на массив с типом элементов Figure. Каждому элементу

массива–аргумента должно быть присвоено значение ссылки на объект конкретного

класса, производного от Figure.

В следующем фрагменте программы 13_13.сs определён массив ссылок с

типом Figure. Его элементам присвоены ссылки на объекты классов Rectangle и

Triangle.

class Program

{

static void figSq(Figure f)

{ Console.WriteLine("Площадь = " + f.square( )); }

static Figure figRec(Figure[ ] ar, int n) { return ar[n]; }

static void Main( )

{

Figure[ ] arF = new Figure[4];

arF[0] = new Rectangle(3.0, 4.0);

arF[1] = new Triangle(5.0, 4.0);

Triangle tri = new Triangle(8.0, 4.0);

arF[2] = tri;

Rectangle rec = new Rectangle(1.0, 3.0);

arF[3] = rec;

for (int i = 0; i < arF.Length; i++)

{

Figure f = figRec(arF, i);

figSq(f);

}

Console.WriteLine("Типы элементов массива: ");

foreach (Figure g in arF)

Console.WriteLine(g.GetType( ));

}

}

Результат выполнения программы:

Площадь = 12

Площадь = 10

Площадь = 16

Площадь = 3

Типы элементов массива:

Rectangle

Triangle

Triangle

Rectangle

В программе элементы массива arF обрабатываются в двух циклах. В цикле с

заголовком for переменной Figure f присваиваются значения, возвращаемые

методом figRec(). Затем f используется в качестве аргумента метода figSq(). Тем

самым выводятся значения площадей всех фигур, "адресованных" элементами

массива arF.

В цикле с заголовком foreach перебираются все элементы массива arF и к

каждому значению элемента, которое присвоено переменной Figure g, применяется

метод GetType(). Результат – список названий классов, реализовавших абстрактный

класс Figure.

Возможность присваивать элементам массива с типом абстрактного класса

ссылок на объекты любых классов, реализовавших абстрактный, является очень

сильным

средством

полифоризма.

Не

меньше

возможности

обеспечивает

применение ссылок с типом абстрактного класса в качестве параметров и

возвращаемых методами значений.

Контрольные вопросы

Объясните различие между агрегацией и композицией классов.

Какого типа параметр должен быть у конструктора класса, находящегося в

отношении агрегации с включаемым классом?

Какие члены внешнего класса доступны для вложенного класса?

Какой статус доступа должен иметь вложенный класс, чтобы он был доступен там,

где виден внешний класс?

Как обратиться к члену вложенного класса вне внешнего класса?

В чём отличия вложения классов от агрегации и композиции?

Сколько прямых базовых классов допустимо для производного класса?

Какова роль инициализатора конструктора в конструкторе производного класса?

Что такое спецификация базы класса?

Какие члены базового класса наследуются производным классом?

Объясните правила доступа к членам базового класса из методов производного

класса.

Объясните правила доступа к членам базового класса для объектов производног

о

класса.

Что такое защищённый член класса?

Как различаются при внешних обращениях одноимённые члены базового и

производного классов?

Как различаются одноимённые члены базового и производного классов в

обращениях из производного класса?

Каково назначение модификатора new в производном классе?

Как и где вызывается конструктор базового класса из конструктора производного

класса?

Какие действия выполняются автоматически при отсутствии в конструкторе

производного класса обращения к конструктору базового класса?

В каком отношении могут находиться одноимённые методы базового и

производного классов?

Что такое экранирование при наследовании классов?

Должны ли совпадать типы возвращаемых значений при экранировании методов?

Что такое виртуальный метод?

В каком случае ссылки с типом базового класса доступен метод производного

класса?

В каком случае применяется модификатор override?

Какой статус доступа должен быть у виртуального метода?

Может ли быть виртуальным свойство?

Объясните различия между динамическим и статическим связыванием.

Что такое статический и динамический типы ссылки?

Чем должно быть тело абстрактного метода?

Назовите особенности абстрактного метода.

Где должен быть объявлен абстрактный метод?

Что такое опечатанный класс?

Приведите примеры опечатанных классов из .NET Framework.

Каковы возможности массивов ссылок с типом абстрактного класса?

Соседние файлы в папке CSBasicCourse2ndedPodbelsky