Logo

11 декабря 2014 г.

Этюд 8. Реализация свойства памятью

Этот этюд продолжает тему альтернатив «геттерам» и «сеттерам» в Канторе. Как уже говорилось, переменные в Канторе — это функции, реализованные памятью. Пришло время показать это на примере.

На Delphi

Задача этого этюда противоположна предыдущей. В этот раз мы имеем абстрактное свойство, реализованное виртуальными методами, перекрываемыми затем в потомке.

На Delphi код оберток снова приходится писать вручную:
type
  TLengthy = class
  protected
    function GetLength: Integer; virtual; abstract;
    procedure SetLength(Value: Integer); virtual; abstract;
  public
    property Length: Integer read GetLength write SetLength;
  end;

  TSegment = class(TLengthy)
  private
    FLength: Integer;
  protected
    function GetLength: Integer; override;
    procedure SetLength(Value: Integer); override;
  end;

{ TSegment }

function TSegment.GetLength: Integer;
begin
  Result := FLength;
end;

procedure TSegment.SetLength(Value: Integer);
begin
  FLength := Value;
end;

На Канторе

Компилятор Кантора осведомлен о связи функций и переменных, поэтому нужную обертку сгенерирует сам:
public class Lengthy of
  public out Core:LongInt Length; // out-свойство
  public Length(Core:LongInt value); // in-свойство
end;

public class Segment from Lengthy of
  public var Core:LongInt Length; // реализация памятью
end;
Разница с прошлым этюдом — в расположении автогенерируемой обертки: в прошлый раз она располагалась в предке, а тут — в потомке. С концептуальной точки зрения это трактуется как реализация памятью (переменной), поскольку одно var-свойство перекрывает сразу оба связанных in- и out-свойства из предка.

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.