На 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», можно оставить комментарий от своего имени без предварительной регистрации.
Примечание. Отправлять комментарии могут только участники этого блога.