Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2019, 01:53   #1
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию Использование разных свойств объекта в зависимости от его класса

Здравствуйте.

Нубский вопрос, но всё же... Подскажите пожалуйста, как в freepascal можно обращаться к свойствам объекта, когда его тип определяется на этапе выполнения программы и набор свойств различен?

Набросал небольшой пример. Допустим, есть классы "Круг" и "Прямоугольник", производные от базового класса "Фигура". Во время выполнения программы в зависимости от выбора пользователя создаётся объект одной из фигур. Если выбрали "Прямоугольник" - заполняются свойства "Ширина" и "Высота". Если окружность - "Радиус".

Код:
program shapes;

uses
    SysUtils;

type

  TShape = class
  public
    function GetArea: Single; virtual; abstract;
  end;

  { TRectangle }

  TRectangle = class(TShape)
  public
    Width, Height: Single;
    function GetArea: Single; override;
  end;

  { TCircle }

  TCircle = class(TShape)
  public
    Radius: Single;
    function GetArea: Single; override;
  end;

{ TCircle }

function TCircle.GetArea: Single;
begin
  Result := Radius * Radius * 3.14;
end;

{ TRectangle }

function TRectangle.GetArea: Single;
begin
  Result := Width * Height;
end;

var
  Shape: TShape;
  Input: String;
begin
  WriteLn('Choose shape:');
  WriteLn('  c - Circle');
  WriteLn('  r - Rectangle');
  ReadLn(Input);
  case Input of
    'c':
      begin
        Shape := TCircle.Create;

        Write('Input radius: ');
        ReadLn(Input);
        Shape.Radius := StrToFloat(Input);
      end;

    'r':
      begin
        Shape := TRectangle.Create;

        Write('Input width: ');
        ReadLn(Input);
        Shape.Width := StrToFloat(Input);

        Write('Input height: ');
        ReadLn(Input);
        Shape.Height := StrToFloat(Input);
      end;
  end;
  WriteLn('Area = ', Shape.GetArea);
  ReadLn;
end.
Разумеется, компилятор ругается на отсутствие методов Width, Height и Radius у объекта типа TShape.

Как вариант вижу возможность создать по одной переменной каждого класса и в зависимости от выбора использовать одну из них. Но скорее всего можно сделать проще.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 09.03.2019, 08:33   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
        Shape := TRectangle.Create;

        Write('Input width: ');
        ReadLn(Input);
        Shape.Width := StrToFloat(Input);

        Write('Input height: ');
        ReadLn(Input);
        (Shape as TRectangle).Height := StrToFloat(Input);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование объекта класса как элемента массива в другой форме Niven C++ Builder 1 04.02.2017 11:11
[Java] Создание объекта внутри объекта этогоже класса. Svarogich Помощь студентам 2 01.08.2011 16:03
Использование одинаковых свойств разных записей. Alex Cones Общие вопросы Delphi 6 30.01.2011 15:04
Использование метода repaint() объекта класса JPanel Alexcomeback Общие вопросы по Java, Java SE, Kotlin 1 31.10.2010 13:12
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37