Помимо полей и методов в объектах существуют свойства.
1. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Создание сопутствующего эффекта достигается тем, что за присваиванием свойству значения стоит вызов метода.
2. Объявление свойства выполняется с помощью зарезервированного слова property:
property propertyName[indexes]: type index integerConstant specifiers; |
Где:
· propertyName – любой корректный идентификатор;
· type – предопределенный или декларированный раньше тип;
· specifiers – спецификаторы доступа;
· [indexes] – необязательный параметр, который позволяет описать индексированное свойство (свойство-массив);
· index integerConstant – необязательная секция, содержащая ключевое слово index и некоторую константу типа Integer (передается автоматически как параметр для методов, указанных в спецификаторах доступа), используется для методов, обслуживающих несколько свойств.
Простейший пример:
Type Tfigure = class private Fcolor:TColor; ... Protected //Метод записи (установки значения)свойства Procedure setColor(c:TColor); virtual; Property Color: TColor read Fcolor write setcolor; // Свойство end; |
3. При объявлении свойства используются ключевые слова: read, write, stored, default (nodefault)иimplements,которыеназываются спецификаторами доступа. Каждое свойство должно обязательно содержать хотя бы один из спецификаторов: read, write.
· read – указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства. Например, чтение свойства Color означает чтение поля Fcolor.
· write — поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, установка свойства — вызов метода SetColor.
· stored –
4. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field).
5. Обращение к свойствам выглядит в программе как обращение к полям:
var Fugure: TFigure;... Figure.Color := red; // Эквивалентно Figure.SetColor(red); If Figure.Color = red then // Эквивалентно Figure.Fcolor; ShowMessage(‘Красный’); |
6. Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.
7. В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию @. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.
8. Технология объектно-ориентированного программирования в среде Delphi предписывает избегать прямого обращения к полям, создавая вместо этого соответствующие свойства. Это упорядочивает работу с объектами, изолируя их данные от непосредственной модификации. В будущем внутренняя структура класса, которая иногда является достаточно сложной, может быть изменена с целью повышения эффективности работы программы. При этом потребуется переработать только методы чтения и записи значений свойств; внешний интерфейс класса не изменится.