Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование программ.doc
Скачиваний:
12
Добавлен:
05.05.2019
Размер:
12.37 Mб
Скачать

4.2.7 Наследование и полиморфизм

Рассмотрим два простых примера (не рассматривая реализацию методов и полный текст программы), которые демонстрируют очень важные принципы объектно-ориентированного конструирования программ наследование и полиморфизм.

Пример перекрытия метода абстрактного класса в наследуемых классах:

type

TFigure = class {Геометрическая фигура. Базовый, абстрактный класс.

Не содержит реализации методов }

procedure Draw; virtual; abstract; {Описывает рисование фигуры}

end;

TRectangle = class(TFigure) {Класс Прямоугольник.

Наследуется от класса TFigure

procedure Draw; override; {Переопределяет процедуру Draw базового класса. Рисует прямоугольник }

end;

TEllipse = class(TFigure) {Класс Эллипс.

Наследуется от класса TFigure }

procedure Draw; override; {Переопределяет процедуру Draw базового класса. Рисует эллипс}

end;

Абстрактный класс TFigureбазовый класс описания геометрических фигур. В этом классе не определяется, какая именно геометрическая фигура будет создана и как она будет нарисована. Уточнение и реализация метода отображения геометрической фигуры осуществляется в наследуемых классах (в примере это прямоугольник и эллипс). Используя такую иерархию классов, можно сконструировать обобщенную процедуру DrawFigure, которая рисует геометрическую фигуру:

procedure DrawFigure (Figure: TFigure);

begin

Figure.Draw; {Рисует фигуру, которая соответствует объекту класса

TFigure}

end;

Таким образом, если передать в процедуру DrawFigure объект класса TFigure или наследуемого от него, то будет вызвана процедура Draw, того класса, к которому принадлежит объект (например, если это объект класса TEllipse, то будет нарисован эллипс). В этом и заключается полиморфизм.

Пример перегрузки виртуального метода в наследуемом классе:

type

T1 = class(TObject)

procedure Test(I: Integer); overload; virtual;

end;

T2 = class(T1)

procedure Test(S: string); reintroduce; overload;

end;

Для перегрузки виртуального метода класса-родителя T1 в наследуемом классе T2 добавьте ключевое слово reintroduce в спецификацию метода Test.

Вот что происходит при вызове метода Test для объекта класса T2:

SomeObject := T2.Create; // создаем объект SomeObject класса T2

SomeObject.Test('Hello!'); // вызывается метод T2.Test

SomeObject.Test(7); // вызывается метод класса-родителя T1.Test

4.2.8 События

События возникают в результате воздействий Пользователя, аппаратуры компьютера или других программ. Известие о наступлении события в операционной системе Windows – это сообщение.

События имеют разное количество и тип параметров в зависимости от происхождения и предназначения. Общим для всех является параметр sender – он указывает на объект-источник события.

В Delphi вызовы обработчиков событий находятся в методах, обрабатывающих сообщения Windows.

Все события в Delphi принято предварять префиксом On. Например, onCreate, onMouseMove, onPaint и другие.

4.2.9 Исключительные ситуации

Исключительная ситуация – это ситуация, которая возникает в результате ошибки в работе программы (например, деление на ноль, попытка открыть несуществующий файл или получить данные по нулевому указателю).

Для обработки исключительных ситуаций предназначены специальные классы и операторы языка Object Pascal:

  • Exception (исключение) – базовый класс для всех классов–исключительных ситуаций. Названия классов, наследуемых от Exception, начинаются с Е, например EZeroDivide

  • Операторы tryexcept и tryfinally. В случае возникновения исключительной ситуации выполнение программы немедленно прекращается, и управление передается операторам, идущим за ключевыми словами except или finally.