6.6.1 Определение

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

Полем класса могут быть и свойства. Свойство функционирует как и обычное поле, то есть его значение может быть прочитано ​​или установлено, но она позволяет переориентировать доступ к полю с помощью функций и процедур. Они предоставляют средства, чтобы связать действие с присвоением или чтением из поля класса. Это позволяет, например, проверить, что значение является действительным для присвоении или при чтении, что позволяет конструировать значения на лету. Кроме того, свойства могут быть только для чтения или только для записи. Прототип объявления свойства выглядит следующим образом:


Свойства

604


Read specifier (спецификатор чтения) либо имя поля (переменной), которое содержит свойство, либо имя функции (метода), имеющее тот же тип что и тип свойства. В случае простого (simple) типа, эта функция не должна иметь аргумент. В случае массива свойств (array property), функция должна иметь один аргумент типа индекса массива. В случае индексируемого свойства, она должно брать целое число в качестве аргумента.

Read specifier (спецификатор чтения) не является обязательным, и если его нет, то это свойство только для записи. Обратите внимание, что методы класса не могут быть использованы в качестве спецификаторов (методов) чтения.

Write specifier (спецификатор записи) - тоже не обязателный: Если его нет, то свойство только для чтения. Write specifier (спецификатор записи) - это либо имя поля (переменной), либо имя процедуры (метода), который принимает в качестве единственного аргумента переменную того же типа, что и свойство. В случае массива свойств (array property), процедура должна принимать два аргумента: первый аргумент должен иметь тот же тип, что и индекс, второй аргумент должен быть того же типа, что и свойство. Так-же, в случае индексированного свойства, первый параметр должен быть целым числом.

Секция (private, published), в которой заключается указанная функция или процедура не имеет никакого значения. Однако, чаще это будет protected или private метод.

Например, учитывая следующее объявление:

Type

MyClass = Class

  Private

  Field1 : Longint;

  Field2 : Longint;

  Field3 : Longint;

  Procedure Sety (value : Longint);

  Function Gety : Longint;

  Function Getz : Longint;

  Public

  Property X : Longint Read Field1 write Field2;

  Property Y : Longint Read GetY Write Sety;

  Property Z : Longint Read GetZ;

  end;

 

Var

MyClass : TMyClass;

Ниже приведены допустимые действия:

WriteLn ('X : ',MyClass.X);

WriteLn ('Y : ',MyClass.Y);

WriteLn ('Z : ',MyClass.Z);

MyClass.X := 0;

MyClass.Y := 0;

Но следующее присвоение будет генерировать ошибку:

MyClass.Z := 0;

потому Z является свойством только для чтения.

В приведенных выше действиях происходит то, что, когда читается значение, компилятор вызывает метод объекта getNNN, и используется результат вызова этого метода. Когда задание присваивается (свойству), компилятор передает значение , которое должно быть присвоено в качестве параметра для различных методов setNNN.

Из-за этого механизма свойства не могут быть переданы в качестве var аргументов в функции или процедуры, так как неизвестен адрес свойства (по крайней мере, не всегда).