Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
67
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Свойства

Свойства позволяют осуществлять доступ к полям класса, попутно выполняя некоторые действия. Свойство описывается в классе следующим образом:

property Prop: тип read имя функции чтения write имя процедуры записи; 

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

function getProp: тип; procedure setProp(v: тип);

Секция write может быть опущена, тогда доступ к полю через свойство можно осуществлять только на чтение (свойства только для чтения).

Например, рассмотрим тип Person (персона), имеющий поле _age (возраст). Доступ к полю _age будем осуществлять через свойство Age:

type Person=class   _age: integer;   procedure setAge(a: integer);   begin     if a>0 then _age:=a     else writeln('Ошибка в Person.setAge: возраст не может быть отрицательным');   end;   function getAge: integer;   begin     writeln('Осуществлен доступ к полю _age на чтение');     Result:=_age;   end;   property Age: integer read getAge write setAge; end; var   p: Person;   a: integer; ... p:=Person.Create; p.Age:=-3; // выводится сообщение об ошибке i:=p.Age; // выводится сообщение о чтении поля _age 

Всякий раз, когда мы присваиваем свойству Age новое значение , вызывается процедура setAge с соответствующим параметром. Всякий раз, когда мы считываем значение свойства Age, вызывается функция getAge.

Из примера видно, что свойства ведут себя аналогично полям. При этом они могут производить дополнительные действия, например, проверку на допустимость присваиваемого значения. Доступ же к полям классов напрямую сопряжен с ошибками:

p._age:=-3;

Присваивание полю _age отрицательного значения ошибочно, но подобная ошибка не будет обработана.

Вместо имени функции чтения или имени процедуры записи можно использовать имя поля, например:

property Age: integer read _age write setAge;

В этом случае строка i:=p.Age эквивалентна строке i:=p._age.

Обычно для доступа к полю на чтение в секции read свойства указывается именно поле, т.к. обычно при чтении поля никаких дополнительных действий производить не требуется.

Свойства не могут передаваться по ссылке в процедуры и функции. Например, следующий код ошибочен:

Inc(p.Age); // ошибка!

Если требуется обработать значение свойства, передав его по ссылке, то надо воспользоваться вспомогательной переменной:

a:=p.Age; Inc(a); p.Age:=a;

Свойства очень удобны при работе с визуальными объектами, поскольку позволяют автоматически перерисовывать объект, если изменить какие-либо его визуальные характеристики. Например, если создана кнопка b1 типа Button, то для визуального изменения ее ширины достаточно присвоить значение ее свойству Width:

b1.Width:=100;

Процедура для записи этого свойства в приватное поле _width будет выглядеть примерно так:

procedure SetWidth(w: integer); begin   if (w>0) and (w<>_width) then   begin     _width:=w;     <перерисовка кнопки>   end end;

Следует обратить внимание на вторую часть условия в операторе if: w<>_width. Добавление этой проверки позволяет избежать лишней перерисовки кнопки в случае, если ее ширина не меняется.