Иерархия Классов Для Представления Геометрических Фигур

13.04.2012
12
0
#1
Всем привет.

На данном этапе просто хочу убедиться, что наследование реализовано корректно. Но когда пробую вызвать GetName, то возвращается только geometry. Остальные значения - пустые. Подорзреваю, что это из-за того, что неправильно работают конструкторы.
Как это исправить?

Т.е., я хочу добиться того, чтобы на данном этапе программа выдавала

geometry
polyline
polygon
ellipse
rectangle
а не только geometry (а затем 4 пустые строки).

Условие задачи
Разработать иерархию классов для представления геометрических
фигур: прямая, ломанная, прямоугольник, эллипс, многоугольник.
Разработать контейнер для хранения фигур.
Контейнер для хранения фигур реализовать в виде интерфейса с
общими методами для всех фигур. Классы каждой из фигур должны быть
реализацией данного интерфейса.

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type

// Описание интерфейса

//

// Класс геометрии - общий класс всей иерархии

TGeometry = class(TInterfacedObject)

FName: String;	// поля
//Length: Real;

function GetName: String; virtual; // методы

procedure SetName(N: String); virtual;

constructor Create(N: String);

procedure SetXY;

end;

procedure TGeometry.SetXY;
begin
end;

constructor TGeometry.Create(N: String);
begin
FName := N;
end;

function TGeometry.GetName: String;
begin
GetName := FName;
end;

procedure TGeometry.SetName(N: String);
begin
FName := N;
end;


// класс полилинии

type TPolyline = class(TGeometry)

XCoords: Array[1..4] of Integer;
YCoords: Array[1..4] of Integer;
Length: Real;

constructor Create(N: String);

procedure SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer; x4: Integer; y4: Integer);
function GetLength: Real;

function GetName: String; override;
procedure SetName(N: String); override;

end;

constructor TPolyline.Create(N: String);
var
i: Integer;
begin
inherited Create(N);
Length := 0;

for i := 1 to 4 do
begin
XCoords[i] := 0;
YCoords[i] := 0;
end;
end;

procedure TPolyline.SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer; x4: Integer; y4: Integer);
begin

XCoords[1] :=  x1;
XCoords[2] :=  x2;
XCoords[3] :=  x3;
XCoords[4] :=  x4;

YCoords[1] :=  y1;
YCoords[2] :=  y2;
YCoords[3] :=  y3;
YCoords[4] :=  y4;

end;

function TPolyline.GetLength: Real;
var l: Real;
begin
l := Sqrt( Exp(2*(XCoords[2] - XCoords[1])) + Exp(2*(YCoords[2] - YCoords[1])) +
Exp(2*(XCoords[3] - XCoords[2])) + Exp(2*(YCoords[3] - YCoords[2])) +
Exp(2*(XCoords[4] - XCoords[3])) + Exp(2*(YCoords[4] - YCoords[3])) );

Length := l;
GetLength := l;

end;

procedure TPolyline.SetName(N: String);
begin
inherited SetName(N);
end;

function TPolyline.GetName: String;
begin
inherited GetName;
end;

// класс линии

type TLine = class(TPolyline)

constructor Create(N: String);

procedure SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer);
function GetLength:Real;

function GetName: String; override;
procedure SetName(N: String); override;

end;

constructor TLine.Create(N:String);
begin

XCoords[1] :=  0;
XCoords[2] :=  0;

YCoords[1] :=  0;
YCoords[2] :=  0;

end;
///////////////////////////////////////////////////////
function TLine.GetName:String;
begin
inherited GetName;
end;


procedure TLine.SetName(N:String);
begin
inherited SetName(N);
end;
////////////////////////////////////////

procedure TLine.SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer);
begin

XCoords[1] :=  x1;
XCoords[2] :=  x2;

YCoords[1] :=  y1;
YCoords[2] :=  y2;

end;

function TLine.GetLength:Real;
var
l: Real;
begin

l := Sqrt( Exp(2*(XCoords[2] - XCoords[1])) + Exp(2*(YCoords[2] - YCoords[1])) );
Length := l;

GetLength := l;
end;


// класс полигона

type TPolygon = class(TGeometry)

XCoords: Array[1..5] of Integer;
YCoords: Array[1..5] of Integer;

function GetArea: Real;

function GetName: String; override;
procedure SetName(N: String); override;

procedure SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer; x5: Integer; y5: Integer);

constructor Create(N: String);

end;

function TPolygon.GetArea: Real;
begin
GetArea := 0;
end;

function TPolygon.GetName: String;
begin
inherited GetName;
end;

procedure TPolygon.SetName(N:String);
begin
inherited SetName(N);
end;

procedure TPolygon.SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer; x5: Integer; y5: Integer);
begin

XCoords[1] :=  x1;
XCoords[2] :=  x2;
XCoords[3] :=  x3;
XCoords[4] :=  x4;
XCoords[5] :=  x5;

YCoords[1] :=  y1;
YCoords[2] :=  y2;
YCoords[3] :=  y3;
YCoords[4] :=  y4;
YCoords[5] :=  y5;

end;

constructor TPolygon.Create(N: String);
begin

inherited Create(N);

XCoords[1] :=  0;
XCoords[2] :=  0;
XCoords[3] :=  0;
XCoords[4] :=  0;
XCoords[5] :=  0;

YCoords[1] :=  0;
YCoords[2] :=  0;
YCoords[3] :=  0;
YCoords[4] :=  0;
YCoords[5] :=  0;

end;

// класс эллипса

type TEllipse = class(TPolygon)

//XCoords: Array[1..4] of Integer;
//YCoords: Array[1..4] of Integer;

function GetArea: Real;

function GetName: String; override;
procedure SetName(N: String);  override;

procedure SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer);

constructor Create(N: String);

end;

constructor TEllipse.Create(N: String);
begin

inherited Create(N);

XCoords[1] :=  0;
XCoords[2] :=  0;
XCoords[3] :=  0;
XCoords[4] :=  0;

YCoords[1] :=  0;
YCoords[2] :=  0;
YCoords[3] :=  0;
YCoords[4] :=  0;

end;

function TEllipse.GetArea: Real;
begin
GetArea := 1;
end;

function TEllipse.GetName: String;
begin
inherited GetName;
end;

procedure TEllipse.SetName(N:String);
begin
inherited SetName(N);
end;

procedure TEllipse.SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer);
begin

XCoords[1] :=  x1;
XCoords[2] :=  x2;
XCoords[3] :=  x3;
XCoords[4] :=  x4;

YCoords[1] :=  y1;
YCoords[2] :=  y2;
YCoords[3] :=  y3;
YCoords[4] :=  y4;

end;

// класс прямоугольника

type TRectangle = class(TPolygon)

//XCoords: Array[1..4] of Integer;
//YCoords: Array[1..4] of Integer;

function GetArea: Real;

function GetName: String; override;
procedure SetName(N: String); override;

procedure SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer);

constructor Create(N: String);

end;

constructor TRectangle.Create(N: String);
begin

inherited Create(N);

XCoords[1] :=  0;
XCoords[2] :=  0;
XCoords[3] :=  0;
XCoords[4] :=  0;

YCoords[1] :=  0;
YCoords[2] :=  0;
YCoords[3] :=  0;
YCoords[4] :=  0;

end;

procedure TRectangle.SetXY(x1:Integer; y1:Integer; x2: Integer; y2: Integer; x3: Integer; y3: Integer;
x4:Integer; y4:Integer);
begin

XCoords[1] :=  x1;
XCoords[2] :=  x2;
XCoords[3] :=  x3;
XCoords[4] :=  x4;

YCoords[1] :=  y1;
YCoords[2] :=  y2;
YCoords[3] :=  y3;
YCoords[4] :=  y4;

end;

function TRectangle.GetName: String;
begin
inherited GetName;
end;

procedure TRectangle.SetName(N:String);
begin
inherited SetName(N);
end;

function TRectangle.GetArea: Real;
var
A: Real;
begin
A := (XCoords[4] - XCoords[1]) * (YCoords[2] - YCoords[1]);
GetArea := A;
end;

var

geom, polyline, polygon, line, ellipse, rectangle: TGeometry;

n: String;
a: Integer;

begin

geom := TGeometry.Create('geometry');
n := geom.GetName;
WriteLn(n);

//polyline
polyline := TPolyline.Create('polyline');
n := polyline.GetName;
WriteLn(n);
//polygon
polygon := TPolyline.Create('polygon');
n := polygon.GetName;
WriteLn(n);
//ellipse
ellipse := TEllipse.Create('ellipse');
n := ellipse.GetName;
WriteLn(n);
//rectangle
rectangle := TRectangle.Create('rectangle');
n := rectangle.GetName;
WriteLn(n);

ReadLn;

end.