Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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;

Interface

Type

TGeomFigure = class          {Описание класса TgeomFigure с виртуальным абстрактным методом Draw}

 Procedure Draw; virtual; abstract;

End;                         {Заголовок абстрактного метода. Описательная часть класса не содержит реализации данного метода}

TLine = class Procedure Draw; override;

End;                         {Описание класса Tline с переопределенным методом Draw}

Implementation

Procedure TLine.Draw;

 Begin

{Вывод линии}

end;                        {Описание метода Draw класса TLine, -который в классе-родителе описан как абстрактный}

Procedure OsingPolymorph;

Var GeomFigure: TGeomFigure;              {Переменная — ссылка на экземпляр класса TGeomFigure}

Begin

GeomFigure:= TLine.Create;

GeomFigure. Draw;            {В момент выполнения такого вызова переменная GeomFigure должна указывать не на экземпляр класса TGeomFigure, а на экземпляр класса-наследника, переопределившего абстрактный метод Draw. В данном случае, это экземпляр класса TLine}

GeomFigure. Free;

End;

End.

 

5.4.4. Полиморфизм и property-свойства

Рассмотрим пример, приведенный в листинге 5.19. Отметим использование свойства полиморфности объектов в рассмотренном примере. При установке значения property-свойству Color автоматически вызывается метод SetColor, которому в качестве параметра передается новое значение цвета. Данное значение заносится в protected-свойство f Color, а затем производится автоматический вызов метода Draw.

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

Такой подход позволяет локализовать отдельные фрагменты логики сложных классов уже на стадии проектирования вершины иерархии, существен­но упрощая тем самым разработку программного продукта в целом.

Листинг 5.19. Полиморфизм и property -свойства

unit Geom 5;

Interface

Type

TGeomFigure = class

Protected

fColor: Integer;   {Описание свойства с областью видимости protected}

Procedure Draw; virtual, {Метод прорисовки геометрической фигуры (виртуальный, предназначен для переопределения в классах-наследниках)}

Procedure SetColor(aColor: Integer);

{Процедура установки protected- -свойства fColor}

Public

Property Color: Integer read fColor write SetColor;

{Описание property-свойства Color}

End;

Implementation



Поделиться:


Последнее изменение этой страницы: 2021-04-04; просмотров: 51; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.72.24 (0.006 с.)