Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основные механизмы и положения объектно-ориенти...doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
261.12 Кб
Скачать

Interface

Procedure DrawFigure(Figure: TGeomFigure) ;

{Заголовок процедуры}

Implementation

Procedure DrawFigure(Figure : TGeomFigure) ;

{Описание процедуры}

begin

If Figure is TLine {Проверка соответствия объекта, на который указывает переменная Figure, классу TLine}

Then Figure.Draw {Если тип объекта — TLine, то вызывается метод Draw}

Else Expend; {В противном случае — выход из процедуры}

End.

Оператор as

В рассмотренном примере (листинг 5.17) допускается вызов метода Draw из объекта, на который указывает параметр Figure, переданный в процедуру, так как заявленный тип параметра позволяет это сделать — в классе TGeomFigure описан метод Draw. Однако иногда требуется вызвать метод, который реализован не в заявленном классе, а в его наследнике, реальный экземпляр которого и передается в качестве параметра. Попытка сделать это вызовет ошибку компиляции.

Для указания компилятору о том, что объект следует рассматривать как экземпляр какого-либо конкретного класса, предусмотрен оператор as, используемый следующим образом:

<Ссылка на объект> as <Название класса>

В результате такого указания Delphi пытается обращаться к объекту, на который указывает ссылка, как к экземпляру заданного класса. Так. если бы в описании класса TGeomFigure не было метода Draw, а описание его располагалось бы в классе TLine, то метод можно было бы вызвать следующим образом:

If Figure is tLine

{Проверка соответствия объекта, на который указывает переменная Figure, классу TLine}

Then (Figure as TLine) .Draw

{Если тип объекта — TLine, то вызывается метод Draw}

Else Exit; {В противном случае — выход из процедуры}

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

5.4.3. Абстрактные методы

Использование наследования и связанного с ним свойства полиморфизма очень удобно при проектировании сложных систем, состоящих из групп классов, имеющих смысловое единство. Такие классы обычно имеют одного родителя, в котором прописываются заголовки методов, необходимых для поддержки функциональности ветви иерархии. В рассматриваемых нами примерах таким классом был TGeomFigure, в котором метод Draw описывался, но не выполнял каких-либо конкретных действий.

Для того, чтобы не описывать «пустых» методов, увеличивая бесполезный размер исходного текста программ, в Delphi предусмотрен специальный модификатор методов abstract (англ. Abstract — абстрактный, фиктивный):

Procedure <Класс>.<Метод>(<Список параметров>); virtual; abstract;

Или для методов-функций:

Function <Класс>.<Метод>(<Список параметров>): <Тип значе-ния>; virtual; abstract;

Описание метода, помеченного ключевым словом abstract, в классе, где он описан, не требуется, однако и вызвать его из экземпляра данного класса невозможно. При попытке произвести такой вызов возникнет ошибка времени выполнения программы "Project Projectl.exe raised exception class EAbstractError with message 'Abstract Error'."— "Исключительная ситуация EAbstractError в проекте Projectl.exe".

Абстрактный метод всегда является виртуальным (помечен ключевым словом virtual) или динамическим (помечен ключевым словом dynamic) и может быть переопределен в одном из классов-потомков. Соответственно, из экземпляров классов, переопределивших абстрактный метод, его вызов возможен.

Абстрактные методы называют иногда чисто виртуальными, пример их использования приведен в листинге 5.18.

Листинг 5.18. Использование абстрактных методов;

unit AbstractMethods;