>end;
>TCircle = class(TShape)
>public
> …..
>function HitTest(X, Y: Integer): Boolean; override;
>end;
>TRectangle = class(TShape)
>public
>…..
>function HitTest(X, Y: Integer): Boolean; override;
>end;
Что это означает? Мы как бы говорим, что класс TShape в принципе может проверить, попали в него координаты мыши или нет, но конкретная реализация зависит от того, какой именно примитив используется. То есть абстрактно функциональность есть, но её реализация должна быть переопределена в классах потомках.
Нашу многострадальную функцию теперь можно переписать так:
>var
>Shapes: array of TShape;
>function HitTest(X, Y: Integer): Boolean;
>var
>I: Integer;
>begin
>Result:= False;
>for I:= 0 to Length(Shapes) — 1 do
>begin
>Result:= Shapes[I].HitTest(X, Y);
>if Result then
>Exit;
>end;
>end;
При этом, в случаю кругов, в реальности будет вызываться функция TCircle. HitTest, а в случае прямоугольников — TRectangle. HitTest.
Понятно, что в случае с одной абстрактной функцией выигрышь не совсем очевиден, но ведь можно расширить базовый класс, добавив в него функции:
>TShape. Move(dx, dy: Integer); virtual; abstract;
для перемещения примитива,
>TShape. Rotate(x, y: Integer; angel: Double); virtual; abstract;
для поворота вокруг точки,
>TShape. Flip(Line: TLine); virtual; abstract;
для зеркального отображения вокруг прямой.
Реализация данных методов уникальна для каждого из классов наследников, однако сама функциональность применима ко всем графическим примитивам.