Обобщения - Free Pascal

Узнай цену своей работы

Формулировка задачи:

program Generics;
 
uses SysUtils;
 
type
  ///Предоставляет методы Print(), Println().
  IGameObject = interface
    procedure Print();
    procedure Println();
  end;
 
type
  ///Главный класс всех сущностей движка.
  TGameObject = class(TObject, IGameObject)
  public
    ///Выводит строковое представление объекта.
    procedure Print();
    ///Выводит строковое представление объекта и переходит на новую строку.
    procedure Println();
  end;
 
procedure TGameObject.Print();
begin
  Write(ToString());
end;
 
procedure TGameObject.Println();
begin
  WriteLn(ToString());
end;
 
type
  ///Предоставляет свойство.
  generic TProperty = class
  private
    _Value: T;
    _IsReadOnly: Boolean;
 
    procedure SetValue(v: T);
 
  public
    ///Значение.
    property Value: T read _Value write SetValue;
    ///Доступно ли свойство только на чтение.
    property IsReadOnly: Boolean read _IsReadOnly write _IsReadOnly;
 
    constructor Create(value_: T; isReadOnly_: Boolean); overload;
    constructor Create(value_: T); overload;
 
    function ToString(): string; override;
  end;
 
procedure TProperty.SetValue(v: T);
begin
  if _IsReadOnly then
    raise SysUtils.EInvalidOp();
  _Value := v;
end;
 
constructor TProperty.Create(value_: T; isReadOnly_: Boolean);
begin
  Value := value_;
  IsReadOnly := isReadOnly_;
end;
 
constructor TProperty.Create(value_: T);
begin
  Create(value_, False);
end;
 
function ToString(): string;
begin
  ToString := Format('Property: (Value: {0}, IsReadOnly: {1})', _Value, _IsReadOnly);
end;
 
begin
end.
Как реализовать конструктор у TProperty, если:
Generics.lpr(60,22) Error: обнаружен некорректный квалификатор .
Ошибок достаточно, но хотелось бы их решить - так как я, возможно, буду писать именно на FPC программы, вместо PascalABC.Net.

Решение задачи: «Обобщения»

textual
Листинг программы
{$mode objfpc}
{$h+}
 
program project1;
 
uses SysUtils;
 
type
  ///Предоставляет методы Print(), Println().
  IGameObject = interface
    procedure Print();
    procedure Println();
  end;
 
type
  ///Главный класс всех сущностей движка.
  TGameObject = class(TInterfacedObject, IGameObject)
  public
    ///Выводит строковое представление объекта.
    procedure Print();
    ///Выводит строковое представление объекта и переходит на новую строку.
    procedure Println();
  end;
 
procedure TGameObject.Print();
begin
  Write(ToString());
end;
 
procedure TGameObject.Println();
begin
  WriteLn(ToString());
end;
 
type
  ///Предоставляет свойство.
  generic TProperty<T> = class
  private
    _Value: T;
    _IsReadOnly: Boolean;
 
    procedure SetValue(v: T);
 
  public
    ///Значение.
    property Value: T read _Value write SetValue;
    ///Доступно ли свойство только на чтение.
    property IsReadOnly: Boolean read _IsReadOnly write _IsReadOnly;
 
    constructor Create(value_: T; isReadOnly_: Boolean); overload;
    constructor Create(value_: T); overload;
 
    function ToString(): string; override;
  end;
 
procedure TProperty.SetValue(v: T);
begin
  if _IsReadOnly then
    raise SysUtils.EInvalidOp.Create('');
  _Value := v;
end;
 
constructor TProperty.Create(value_: T; isReadOnly_: Boolean);
begin
  Value := value_;
  IsReadOnly := isReadOnly_;
end;
 
constructor TProperty.Create(value_: T);
begin
  Create(value_, False);
end;
 
function TProperty.ToString(): string;
begin
  ToString := Format('Property<T>: (Value: {0}, IsReadOnly: {1})', [_Value, _IsReadOnly]);
end;
 
begin
end.

Объяснение кода листинга программы

  1. В данном коде используется язык программирования Free Pascal.
  2. Код содержит объявление интерфейса IGameObject и реализацию методов Print() и Println().
  3. Создано основное класс TGameObject, который наследуется от TInterfacedObject и реализует интерфейс IGameObject.
  4. В классе TGameObject реализованы методы Print() и Println().
  5. Определен тип TProperty, который представляет обобщенное свойство.
  6. В классе TProperty определены приватные поля _Value и _IsReadOnly.
  7. Реализованы методы SetValue(v: T) и ToString().
  8. В конструкторе TProperty инициализируются поля Value и IsReadOnly.
  9. В методе ToString() форматируется строка, содержащая значение и свойство IsReadOnly.
  10. В коде отсутствует пример использования класса TProperty.

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы