FCoordinates: array[0..3] of Longint;
function GetCoordinate(Index: Integer): Longint;
procedure SetCoordinate(Index: Integer; Value: Longint);
Public
property Left: Longint index 0 read GetCoordinate write SetCoordinate;
property Top: Longint index 1 read GetCoordinate write SetCoordinate;
property Right: Longint index 2 read GetCoordinate write SetCoordinate;
property Bottom: Longint index 3 read GetCoordinate write SetCoordinate;
property Coordinates[Index: Integer]: Longint read GetCoordinate
write SetCoordinate;
end;
Наследование и полиморфизм
Рассмотрим два простых примера (не рассматривая реализацию методов и полный текст программы), которые демонстрируют очень важные принципы объектно-ориентированного конструирования программ наследование и полиморфизм.
Пример перекрытия метода абстрактного класса в наследуемых классах:
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