
- •Основные механизмы и положения объектно-ориентированного программирования
- •5.1. Инкапсуляция
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •5.2. Наследование
- •Interface
- •Implementation
- •Interface
- •Implementation
- •5.3. Жизненный цикл экземпляра класса
- •Interface
- •Implementation
- •Inherited;
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •5.4. Полиморфизм
- •5.4.1. Совместимость объектов
- •Класс в Экземпляр
- •Interface Type
- •Implementation
- •Interface
- •Implementation
- •If Figure is tLine
- •Interface
- •Implementation
- •Interface
- •Implementation
- •IColor: Integer;
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 может быть необходимо при создании компонентов, в конструкторе которых следует передать ссылку на компонент-владелец, не известную на этапе разработки программы.