Под инкапсуляцией понимается
скрытие полей объекта с целью обеспечения доступа к ним только посредством методов
класса.
В языке Delphi ограничение
доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта
характеризуется полем, сохраняющим значение свойства, и двумя методами, обеспечивающими
доступ к полю свойства. Метод установки значения свойства называется методом
записи свойства (write), а метод получения значения свойства — методом чтения
свойства (read).
В описании класса перед
именем свойства записывают слово property (свойство). После имени свойства указывается
его тип, затем — имена методов, обеспечивающих доступ к значению свойства. После
слова read указывается имя
метода, обеспечивающего чтение свойства, после слова write — имя метода, отвечающего
за запись свойства.
Ниже приведен пример
описания класса TPerson, содержащего два свойства: Name И Address.
type
TName
= string[15]; TAddress = string[35];
TPerson = class // класс
private
FName:
TName; // значение свойства Name
FAddress: TAddress; // значение свойства Address
Constructor Create(Name:Tname);
Procedure Show;
Function GetName: TName;
Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
public
Property
Name: Tname // свойство Name
read GetName; // доступно только для чтения
Property
Address: TAddress // свойство Address
read GetAddress // доступно для чтения
write SetAddress; // и записи
end;
В программе для установки
значения свойства не нужно записывать инструкцию применения к объекту метода
установки значения свойства, а надо записать обычную инструкцию присваивания
значения свойству. Например, чтобы присвоить значение свойству Address объекта
student, достаточно записать
student.Address := 'С.Петербург,
ул.Садовая
21, кв.3';
Компилятор перетранслирует
приведенную инструкцию присваивания значения свойству в инструкцию вызова метода
student.SetAddress('С.Петербург,
ул.Садовая
21, кв.3');
Внешне применение свойств
в программе ничем не отличается от использования полей объекта. Однако между
свойством и полем объекта существует принципиальное отличие: при присвоении
и чтении значения свойства автоматически вызывается процедура, которая выполняет
некоторую работу.
В программе на методы
свойства можно возложить некоторые дополнительные задачи. Например, с помощью
метода можно проверить корректность присваиваемых свойству значений, установить
значения других полей, логически связанных со свойством, вызвать вспомогательную
процедуру.
Оформление данных объекта
как свойства позволяет ограничить доступ к полям, хранящим значения свойств
объекта: например, можно разрешить только чтение. Для того чтобы инструкции
программы не могли изменить значение свойства, в описании свойства надо указать
лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному
только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании
класса TPerson свойство Name доступно только для чтения, а свойство Address
— для чтения и записи.
Установить значение
свойства, защищенного от записи, можно во время инициализации объекта. Ниже
приведены методы класса TPerson, обеспечивающие создание объекта класса TPerson
и доступ к его свойствам.
// конструктор объекта TPerson
Constructor TPerson.Create(Name:TName);
begin
FName:=Name;
end;
//
метод получения значения свойства Name
Function
TPerson.GetName;
begin
Result:=FName;
end;
//
метод получения значения свойства Address
function
TPerson.GetAddress;
begin
Result:=FAddress;
end;
// метод изменения значения свойства Address
Procedure TPerson.SetAddress(NewAddress:TAddress);
begin
if
FAddress =' '
then FAddress := NewAddress;
end;
Приведенный конструктор
объекта TPerson создает объект и устанавливает значение поля FName, определяющего
значение свойства Name.
Инструкции программы,
обеспечивающие создание объекта класса трегзоп и установку его свойства, могут
быть, например, такими:
student := TPerson.Create('Иванов');
student.Address := 'ул. Садовая, д.3, кв.25';