4.7 Свойства (Properties)

На верх  Назад  Вперёд

В глобальном блоке объявлений можно объявлять свойства, так же, как они могли бы быть определены в классе. Различие в том, что глобальное свойство не нуждается в экземпляре класса: есть только 1 экземпляр этого свойства. Кроме этого, глобальное свойство ведет себя как свойство класса. Спецификаторы чтения-записи для глобального свойства должны также быть регулярными процедурами, но не методами.

Понятие глобального свойства является специфическим для Free Pascal, и не существует в режиме Delphi. Режим ObjFPC обязан работать со свойствами.

Понятие глобального свойства может использоваться, чтобы 'скрыть' расположение значения, или вычислить значение на лету, или проверить значения, которые записаны свойству.

Объявление выглядит следующим образом:


Свойства

402


Ниже приведен пример:

{$mode objfpc}

unit testprop;

 

Interface

 

Function GetMyInt : Integer;

Procedure SetMyInt(Value : Integer);

Property

MyProp : Integer Read GetMyInt Write SetMyInt;

 

Implementation

 

Uses sysutils;

 

Var

FMyInt : Integer;

 

Function GetMyInt : Integer;

begin

Result:=FMyInt;

end;

 

Procedure SetMyInt(Value : Integer);

begin

If ((Value mod 2)=1) then

  Raise Exception.Create('MyProp может содержать только чётные значения');

FMyInt:=Value;

end;

 

end.

Спецификаторы чтения-записи могут быть скрыты, объявляя их в другом модуле, который должен быть в списке uses используемых модулей. Это может использоваться, чтобы скрыть спецификаторы доступа для чтения-записи для программистов, так же, как если бы они были в разделе private  класса (обсуждены ниже). Для предыдущего примера это могло выглядеть следующим образом:

{$mode objfpc}

unit testrw;

 

Interface

 

Function GetMyInt : Integer;

Procedure SetMyInt(Value : Integer);

 

Implementation

 

Uses sysutils;

 

Var

FMyInt : Integer;

 

Function GetMyInt : Integer;

begin

Result:=FMyInt;

end;

 

Procedure SetMyInt(Value : Integer);

begin

If ((Value mod 2)=1) then

  Raise Exception.Create('Разрешены только чётные значения');

FMyInt:=Value;

end;

 

end.

Модуль testprop был бы тогда похож на:

{$mode objfpc}

unit testprop;

 

Interface

 

uses testrw;

 

Property

MyProp : Integer Read GetMyInt Write SetMyInt;

 

Implementation

 

end.

Больше информации о свойствах может быть найдено в Глава 6 Классы.