Итак, принцип инкапсуляции требует, чтобы любая работа со свойствами объекта происходила только через вызовы его методов. Следовательно, если у объекта obj есть свойство n:byte и его надо изменить, следующая строка:
obj.n:=10
некорректна. По идее, надо вызывать метод:
obj.SetN(10)
Однако первый вариант записи (с явным использованием оператора присваивания) гораздо легче воспринимается.
Для того, чтобы можно было использовать более простую форму записи, в объектную модель введен особый способ, позволяющий неявно вызывать методы при записи или чтении значений свойств объекта. Чтобы не путаться, свойствами будем называть только те переменные объекта, которые доступны извне. Все же скрытые его переменные по аналогии с записью будем называть полями.
Рис. 9.3. Поля и свойства.
Иначе говоря, для того, чтобы можно было считывать или изменять значения полей, в соответствие полю ставится свойство объекта (property). Свойство объекта доступно извне объекта. При его изменении или считывании его значения происходит автоматический вызов метода - процедуры или функции, связанной с этим свойством. Таким образом, любые изменения значений полей происходят не напрямую, а только через вызов процедуры/функции.
На Рис. 5.3 представлена схема объекта, имеющего три поля fld1, fld2, fld3. Из них поле fld2 является полностью скрытым – с ним не связано никакое свойство. Данное поле можно использовать только внутри методов объекта, но извне оно не будет доступно. С полями же fld1, fld3 cвязаны свойства prop1и prop3 соответственно. Обычно тип данных свойств совпадает с типом данных связанных с ними полей. Для записи значения в поля предназначены методы SetFld1(n:byte) и SetFld3(n:word). На вход им подаются новые значения свойств. Чтение значений свойств осуществляется методами-функциями GetFld1:byte и GetFld3:word. Описание объекта будет иметь вид:
TYPE TO=CLASS
PRIVATE
fld1:byte;
fld2:string;
fld3:word;
PROCEDURE SetFld1(n:byte);
PROCEDURE SetFld3(n:byte);
FUNCTION GetFld1:byte;
FUNCTION GetFld1:word;
PUBLIC
PROPERTY prop1:byte READ GetFld1 WRITE SetFld1;
PROPERTY prop3:byte READ GetFld3 WRITE SetFld3;
END;
Описание PROPERTY создает свойство объекта и назначает методы для его чтения (READ) и записи (WRITE). Свойство может не иметь метода для записи – тогда оно будет доступно только для чтения, или не иметь метода для чтения – тогда в него можно будет только записывать значения.