Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Иерархия классов для представления геометрических 
:(
    Опции темы
shilovec5377
  Дата 20.6.2014, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 15.5.2013

Репутация: нет
Всего: нет



Всем привет. 

На данном этапе просто хочу убедиться, что наследование реализовано корректно. Но когда пробую вызвать 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.

PM MAIL   Вверх
PointerToNil
Дата 21.6.2014, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: нет
Всего: 6



1) GetName - это функции, они должны возвращать результат. это делает только TGeometry.GetName, остальные - НЕТ
2) ты абсолютно зря писал столько никчемных GetName и SetName - они нужны только в TGeometry, а наследники их просто наследуют (без объявлений и кода) - в этом и состоит фишка наследования: нужный код пишется один раз и не повторяется
3) хороший тон - объявить (в TGeometry) property Name: String read GetName write SetName 
4) GetName тоже не нужен, если написать property Name: String read FName write SetName 
5) SetName в твоей реализации тоже не нужен, если написать property Name: String read FName write FName, но на будущее оставь 
6) какие-то очень странные у тебя ломаная и многоугольник: строго по 4 и 5 точек соответственно. в общепринятом понимании у них может быть произвольное число точек (но > 1 и > 2 соответственно)
7) эллипс - никакой не многоугольник, зря ты так его наследуешь (классика: "M - наследник N" означает, что M является (разновидностью) N)
PM MAIL   Вверх
drkot
Дата 25.6.2014, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(shilovec5377 @  20.6.2014,  20:38 Найти цитируемый пост)
class(TInterfacedObject)
 почему выбран этот родитель? Вы что планируете работать с интерфейсами?

Цитата(shilovec5377 @  20.6.2014,  20:38 Найти цитируемый пост)
Классы каждой из фигур должны быть реализацией данного интерфейса.

Приминительно к делфе звучит как легкий бред... 

Цитата(shilovec5377 @  20.6.2014,  20:38 Найти цитируемый пост)
реализовать в виде интерфейса

Где интерфейсы в Вашей реализации?

Цитата(shilovec5377 @  20.6.2014,  20:38 Найти цитируемый пост)
Разработать иерархию классов для представления геометрических фигур

что под этим понимается? Они визуальны, или нет? Если визуальны, то должен единый метод рисования...
также должна быть возможность прочитать и записать себя в поток (контейнер), или "контейнер" это некая структура в памяти?

То что Вы привели скорее есть не зависимые объекты по какой-то причине имеющие общего предка.

Рекомендации:
- первый класс делается не функциональным, он содержит набор абстрактных функций общих для ВСЕХ наследников
- следующий реализует "пустую" фигуру или точку (как по мне лучше первое)
- далее идет ветвление по типам фигур

- функции объявленные в предках не ПЕРЕОПРЕДЕЛЯЮТСЯ, а только перекрываются. (это касается SetXY )
- если предполагается использование интерфейсов, то кроме дерева классов строится и дерево интерфейсов (функциональностей), они могут быть структурно различны. 

Советую изучить имеющиеся решения и главное определиться с задачей. Мне например очень много не понятно в задании. 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Poseidon
Дата 25.6.2014, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 5
Всего: 133



Для домашних заданий, контрольных и курсовых существует Центр помощи.

Тема перенесена! 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.