Инкапсуляция и свойства объекта
Под
инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним
только посредством методов класса.
В языке
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';