Ну и в чем проьблема?
Ты можешь задать квадрат 2-мя точками? вот тебе и базовый класс.
Код:
type
TShapeBase = class
private
FTopLeft : TPoint;
FBottomRight : TPoint;
public
constructor Create(ATopLeft, ABottomRight : TPoint); virtual;
procedure Stretch(APoint : TPoint; K : Double);
procedure Rotate(APoint : TPoint; AAngle : Double);
procedure Move(AShift : TPoint);
procedure Draw; virtual; abstract;
property TopLeft : TPoint read FTopLeft;
property BottomRight : TPoint read FBottomRight;
end;
TLine = class(TShapeBase)
public
procedure Draw; override;
end;
TSquare = class(TLine)
public
procedure Draw; override;
end;
TFilledSquare = class(TSquare)
private
FFillColor : TColor;
public
constructor Create(ATopLeft, ABottomRight : TPoint; AFillColor : TColor); virtual;
procedure Draw; override;
property FillColor : TColor read FFillColor write FFillColor;
end;
implementation
Реализацию всех методов напишешь сам.
По сути, можно все методы трансформации тоже сделать виртуальными и перекрывать для каждого класса, но по сути они делают одно и то же, так что нет смысла. А обращаться к объектам можно именно как к базовому классу (ну за исключением случая, когда ты хочешь у закрашенного квадрата поменять цвет закраски).