Обобщения - 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.
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.
Объяснение кода листинга программы
- В данном коде используется язык программирования Free Pascal.
- Код содержит объявление интерфейса IGameObject и реализацию методов Print() и Println().
- Создано основное класс TGameObject, который наследуется от TInterfacedObject и реализует интерфейс IGameObject.
- В классе TGameObject реализованы методы Print() и Println().
- Определен тип TProperty
, который представляет обобщенное свойство. - В классе TProperty
определены приватные поля _Value и _IsReadOnly. - Реализованы методы SetValue(v: T) и ToString().
- В конструкторе TProperty
инициализируются поля Value и IsReadOnly. - В методе ToString() форматируется строка, содержащая значение и свойство IsReadOnly.
- В коде отсутствует пример использования класса TProperty
.