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

Тема в разделе "Pascal and Delphi", создана пользователем shilovec5377, 20 июн 2014.

  1. shilovec5377

    shilovec5377 Member

    Регистрация:
    13 апр 2012
    Сообщения:
    12
    Симпатии:
    0
    Всем привет.

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

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

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

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

    Код (Delphi):
    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.
     
Загрузка...

Поделиться этой страницей