Разбираем принцип наследования, создание иерархии классов, создание классов и модулей в Паскале.
Необходимо создать иерархию графических классов в соответствии с рисунком. Описания классов оформить в отдельном модуле.
Предыдущий пост по ООП в Pascal здесь.
Создаем модуль Figures в отдельном файле, запускать его не будем, только скомпилируем. В секции interface прописываем созданные классы, в секции implementation пишем реализацию всех методов.
Исходный класс – точка (tPoint) с полями – координаты и цвет. Установка значений полей происходит в процедуре Init. Кроме того, есть процедуры получения значений координат (getX, getY), вывода на экран (Draw) и скрывания (закрашивания) Hide. Реализация этих процедур описана в предыдущих постах.
От точки наследуется объект окружность. Он имеет такие же свойства – координаты центра и цвет, но еще дополнительное свойство – радиус. Процедуры – Init, Hide, Draw (поскольку они все отличаются от точки). И новая процедура – получение значения радиуса. Процедуры получения значений координат не указываются, поскольку они такие же, как и у класса точки. В процедуре инициализации окружности сначала прописывается процедура инициализации точки, а затем устанавливается радиус окружности. Процедуры рисования и закрашивания используют другие функции графического модуля, поэтому переписываются полностью.
Точно так же описываются остальные потомки. К свойствам предков добавляются новые свойства. В процедуре инициализации дописывается установка новых значений. Если каких-то процедур нет, они добавляются. Если процедура совпадает с такой же у предка, то ее писать не нужно.
Всю иерархию описывать долго, поэтому просто приведу код с комментариями.
Необходимо создать иерархию графических классов в соответствии с рисунком. Описания классов оформить в отдельном модуле.
Предыдущий пост по ООП в Pascal здесь.
Создаем модуль Figures в отдельном файле, запускать его не будем, только скомпилируем. В секции interface прописываем созданные классы, в секции implementation пишем реализацию всех методов.
Исходный класс – точка (tPoint) с полями – координаты и цвет. Установка значений полей происходит в процедуре Init. Кроме того, есть процедуры получения значений координат (getX, getY), вывода на экран (Draw) и скрывания (закрашивания) Hide. Реализация этих процедур описана в предыдущих постах.
От точки наследуется объект окружность. Он имеет такие же свойства – координаты центра и цвет, но еще дополнительное свойство – радиус. Процедуры – Init, Hide, Draw (поскольку они все отличаются от точки). И новая процедура – получение значения радиуса. Процедуры получения значений координат не указываются, поскольку они такие же, как и у класса точки. В процедуре инициализации окружности сначала прописывается процедура инициализации точки, а затем устанавливается радиус окружности. Процедуры рисования и закрашивания используют другие функции графического модуля, поэтому переписываются полностью.
Точно так же описываются остальные потомки. К свойствам предков добавляются новые свойства. В процедуре инициализации дописывается установка новых значений. Если каких-то процедур нет, они добавляются. Если процедура совпадает с такой же у предка, то ее писать не нужно.
Всю иерархию описывать долго, поэтому просто приведу код с комментариями.
Unit FIGURES;Для компиляции не забудьте переключить в меню в разделе Options->Linker значение Link buffer на disk вместо memory, чтобы модуль скомпилировался не в память, а на диск.
interface
Type
{точка. Свойства – координаты и цвет}
tPoint = object
x, y: integer;
color: word;
procedure Init(x0,y0:Integer; color0 : Word);
function getX : Integer;
function getY : Integer;
procedure Hide;
procedure Draw;
end;
{Окружность. Свойства – координаты центра, радиус и цвет}
tCircle=object(tPoint)
Rx:word;
procedure Init(x0,y0,Rx0:Integer; color0 : Word);
function getRx : Integer;
procedure Hide;
procedure Draw;
end;
{эллипс. Свойства – координаты центра, радиус по горизонтали и вертикали и цвет}
tEllipse=object(tCircle)
Ry:word;
procedure Init(x0,y0,Rx0, Ry0:Integer; color0 : Word);
function getRy : Integer;
procedure Hide;
procedure Draw;
end;
{отрезок. Свойства – координаты концов отрезка и цвет}
tLine=object(tPoint)
x1, y1: integer;
procedure Init(x0,y0,x1_0, y1_0:Integer; color0 : Word);
function getX1 : Integer;
function getY1 : Integer;
procedure Hide;
procedure Draw;
end;
{треугольник. Свойства – координаты вершин и цвет}
tTriangle=object(tLine)
x2, y2: integer;
procedure Init(x0,y0,x1_0, y1_0, x2_0, y2_0:Integer; color0 : Word);
function getX2 : Integer;
function getY2 : Integer;
procedure Hide;
procedure Draw;
end;
{точка. Свойства – координаты левого верхнего и правого нижнего углов и цвет}
tRectangle=object(tLine)
{procedure Init(x0,y0,x1_0, y1_0:Integer; color0 : Word);}
procedure Hide;
procedure Draw;
end;
implementation
Uses Crt,Graph;
{методы класса точка}
procedure tPoint.Init(x0, y0 : Integer; color0 : Word);
begin
x:=x0;
y:=y0;
color:=color0;
end;
function tPoint.getX;
begin
getX:=x;
end;
function tPoint.getY;
begin
getY:=y;
end;
procedure tPoint.Draw;
begin
putPixel(x,y,color);
end;
procedure tPoint.Hide;
begin
putPixel(x,y,GetBkColor);
end;
{Методы класса окружность}
procedure tCircle.Init(x0, y0, Rx0 : Integer; color0 : Word);
begin
tPoint.Init(x0,y0,color0);
Rx:=Rx0;
end;
function tCircle.getRx;
begin
getRx:=Rx;
end;
procedure tCircle.Draw;
begin
Setcolor(color);
Circle(x,y,Rx);
end;
procedure tCircle.Hide;
begin
Setcolor(GetBkcolor);
Circle(x,y,Rx);
end;
{методы класса эллипс}
procedure tEllipse.Init(x0, y0, Rx0,Ry0 : Integer; color0 : Word);
begin
tCircle.Init(x0,y0, Rx0,color0);
Ry:=Ry0;
end;
function tEllipse.getRy;
begin
getRy:=Ry;
end;
procedure tEllipse.Draw;
begin
Setcolor(color);
Ellipse(x,y,Rx, Ry);
end;
procedure tEllipse.Hide;
begin
Setcolor(GetBkcolor);
Ellipse(x,y,Rx, Ry);
end;
{Методы класса отрезок}
procedure tLine.Init(x0, y0, x1_0, y1_0 : Integer; color0 : Word);
begin
tPoint.Init(x0, y0: Integer; color0 : Wor
x1:=x1_0;
y1:=y1_0;
end;
function tLine.getX1;
begin
getX1:=x1;
end;
function tLine.getY1;
begin
getY1:=y1;
end;
procedure tLine.Draw;
begin
Setcolor(color);
line(x,y,x1,y1);
end;
procedure tLine.Hide;
begin
Setcolor(GetBkcolor);
line(x,y,x1,y1);
end;
{Методы класса Треугольник}
procedure tTriangle.Init(x0, y0, x1_0, y1_0, x2_0, y2_0 : Integer; color0 : Word);
begin
tLine.Init(x0, y0, x1_0, y1_0: Integer; color0 : Wor
x2:=x2_0;
y2:=y2_0;
end;
function tTriangle.getX2;
begin
getX2:=x2;
end;
function tTriangle.getY2;
begin
getY2:=y2;
end;
procedure tTriangle.Draw;
begin
Setcolor(color);
line(x,y,x1,y1);
line(x1,y1,x2,y2);
line(x2,y2,x,y);
end;
procedure tTriangle.Hide;
begin
Setcolor(GetBkcolor);
line(x,y,x1,y1);
line(x1,y1,x2,y2);
line(x2,y2,x,y);
end;
{Методы класса Прямоугольник}
procedure tRectangle.Draw;
begin
Setcolor(color);
rectangle(x,y,x1,y1);
end;
procedure tRectangle.Hide;
begin
Setcolor(GetBkcolor);
rectangle(x,y,x1,y1);
end;
end.

