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

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 Geom5;

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

Procedure TGeomFigure.SetColor(aColor: Integer);

begin

fColor := aColor; Draw;

end; {Процедура установки protected-свойства fColor заносит новое значение свойства в protected-свойство fColor и вызывает метод Draw для автоматической перерисовки фигуры при смене ее цвета}

Procedure TGeomFigure.Draw;

begin

end;

Procedure UsingFigure;

Var

Figure: TGeomFigure;

IColor: Integer;

begin

Figure := TGeomFigure.Create(3) ;

Figure.Color := 13; {Изменение значения property-свойства Color, автоматически вызывается метод SetColor, изменяющий значение свойства fColor, и метод Draw, выводящий изображение фигуры на экран с использованием нового цвета}

iColor := Figure.Color; {Обращение к property-свойству Color. В качестве значения, В соответствии с описанием данного property-свойства, возвращается значение свойства fColor}

Figure.Free,

end;

End.

5.5. Ключевое слово Self

Для выполнения некоторых задач, методам, реализованным в классе, иногда требуется сослаться на объект (экземпляр класса), из которого вызван метод во время выполнения программы. Поскольку такая ссылка на экземпляр не всегда известна в процессе разработки программы, в Delphi введено ключевое слово Self, вместо которого на этапе выполнения будет подставлен конкретный адрес объекта. Ссылка Self может использоваться как обычная переменная, ссылающаяся на класс.

В качестве примера можно привести метод некоторого класса, который выдает ссылку на экземпляр, из которого вызван данный метод во время выполнения программы:

Туре

AnyClass = class

Function GetSelf:TObject;

end;

Function AnyClass.GetSelf : TObject;

Begin

Result := Self; {Возвращаем ссылку на экземпляр,

из которого вызван метод}

end;

end.

Использование ссылки Self может быть необходимо при создании компонентов, в конструкторе которых следует передать ссылку на компонент-владелец, не известную на этапе разработки программы.