Конкретные классы, порождаемые от TFigure.




Лабораторная работа №3

"Наследование, полиморфизм".

 

Описать типы и привести реализацию трех классов: одного абстрактного (родительского) и двух конкретных (дочерних).

В отдельном модуле Figures.pas описать абстрактный класс TFigure и три его конкретных потомка.

 

Абстрактный класс, некоторые методы абстрактные.

 

Класс – геометрическая фигура на плоскости (TFigure).

Свойства – X,Y – координаты центра (RW, ограничены числом 8 по модулю);
S – площадь фигуры (RW, не больше 100).

Методы – MoveTo (NewX,NewY) – перенос центра в указанную точку;
MoveRel (dX,dY) – перенос центра на указанный вектор;

Equal (f:TFigure) – функция сравнения с другой фигурой (истина, когда совпадают и тип и размеры);
Crossing (f:TFigure) – функция проверки пересечения с другой фигурой (истина, когда есть хотя бы одна общая точка);
ZeroIn – функция, проверяющая, содержит ли фигура начало координат;
Info – функция информация (выводит вид фигуры, координаты, размеры, площадь и значение функции ZeroIn).

Конкретные классы, порождаемые от TFigure.

Требуется описать тип (с добавлением одного свойства) и, при необходимости, переопределить некоторые методы.

Идентификатор типа Описание класса
TPoint Точка на плоскости (площадь всегда 0).
TCircle Круг на плоскости. Дополнительное свойство – R – радиус круга (RW, изначально = 1).
TSquare Квадрат, стороны параллельны осям координат. Дополнительное свойство – A – сторона квадрата (RW, изначально = 1).

 

Работоспособность классов проверить в консольной программе Lab_4.dpr, текст которой приведён ниже (текст не менять):

 

program Lab_4;

 

{$APPTYPE CONSOLE}

 

uses

SysUtils,

Figures in 'Figures.pas';

 

const N=10;

var p: array [1..N] of TFigure;

 

procedure Finish;

var i: byte;

begin

Writeln('3. Finish');

for i:=1 to N do p[i].Free;

end;

 

procedure Table(k:byte);

var i,j: byte;

begin

if k=1 then Write(' Equal ')

else Write(' Cross ');

for j:=1 to N do Write(j:6); Writeln;

for i:=1 to N do begin

Write(i:7,' ');

for j:=1 to N do

if k=1 then Write(p[i].Equal(p[j]):6)

else Write(p[i].Crossing(p[j]):6);

Writeln;

end;

Writeln

end;

 

procedure Show;

var i: byte;

begin

Writeln('------------ F I G U R E S -------------');

for i:=1 to N do Writeln(i:3,' ',p[i].Info);

writeln;

Table(1);

Table(2);

end;

 

procedure Creation;

var i: byte;

begin

Writeln('1.Creation');

for i:=1 to N do

case Random(3) of

0: p[i]:=TPoint.Create;

1: p[i]:=TCircle.Create;

2: p[i]:=TSquare.Create;

end;

end;

 

procedure Moving;

var i: byte;

begin

Writeln('2.Moving');

for i:=1 to N do begin

p[i].MoveTo(Random(10),Random(10));

if p[i] is TCircle then TCircle(p[i]).r:=Random(20);

if p[i] is TSquare then TSquare(p[i]).a:=Random(15);

end;

end;

 

begin

Randomize;

Creation; Show;

Moving; Show;

Finish;

Readln;

end.

 

В этой программе создаются 10 объектов разных типов, являющихся потомками от TFigure (выбор случаен) и выводится информация об их параметрах.

Результат представлен на рисунке ниже:

 

 

На первой таблице виден результат работы конструкторов (центр – начало координат, сторона или радиус равны 1, все содержат начало координат.

Вторая таблица (демо для метода Equal) показывает их тождества. Видно, что тождественны фигуры 1 – 3 (это две окружности), фигуры 2 – 4 – 6 – 9 – 10 (это все точки) и фигуры 5 – 7 – 8 (это три квадрата).

Третья таблица (демо для метода Crossing) показывает, какие пары фигур имеют общие точки. Т.к. начало координат принадлежит всем фигурам, то таблица содержит только TRUE.

 

Далее, ко всем (процедура Moving) объектам были применены методы, изменяющие их параметры случайными значениями.. Результат представлен на рисунке ниже. Для наглядности показана также схема расположения фигур после преобразования.

Как видно, круг 1 не изменился, а круг 3 просто передвинулся (новые параметры оказались недопустимыми). Из пяти точек только две (9 и 10) остались на месте, а точки 2, 4 и 6 переместились. Все три квадрата (5, 7 и 8) передвинулись и изменили размеры.

Из первой таблицы видно, что начало координат (IN) содержат непереместившиеся фигуры (1, 9 и 10), а также большой синий квадрат 7.

Вторая таблица (демо для метода Equal) показывает, что только 2 фигуры (точки 9 и 10) тождественны друг другу, остальные же равны только самим себе.

Взаимное пересечение фигур показывает третья таблица (демо для метода Crossing). Видно, что фигура 7 (большой синий квадрат) пересекается со всеми фигурами, а точка 6 только с этим квадратом.

 

Добейтесь того, чтобы и у Вас содержание обоих таблиц соответствовало параметрам фигур.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: