Читать «Рефакторинг. Зачем?» онлайн - страница 13
DarkGoodWIN
type
TShape = class(TObject)
public
function HitTest(X, Y: Integer): Boolean; virtual; abstract;
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;
Что это означает? Мы как бы говорим, что класс
Нашу многострадальную функцию теперь можно переписать так:
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;
При этом, в случаю кругов, в реальности будет вызываться функция
Понятно, что в случае с одной абстрактной функцией выигрышь не совсем очевиден, но ведь можно расширить базовый класс, добавив в него функции:
TShape. Move(dx, dy: Integer); virtual; abstract;
для перемещения примитива,
TShape. Rotate(x, y: Integer; angel: Double); virtual; abstract;
для поворота вокруг точки,
TShape. Flip(Line: TLine); virtual; abstract;
для зеркального отображения вокруг прямой.
Реализация данных методов уникальна для каждого из классов наследников, однако сама функциональность применима ко всем графическим примитивам.