Инкапсуляция
Как правило, объект – это сложная конструкция, свойства и поведение составных частей которой находится во взаимодействии.
Например, при моделировании взлетающего самолета, после набора им определенной скорости и отрыва от земли принципы управления им полностью изменяются. Поэтому в объекте «самолет» явно недостаточно просто увеличить значение поля «скорость» на несколько км/ч – такое изменение должно автоматически повлечь за собой целый ряд других.
Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление их содержимого должно производится посредством вызова соответствующих методов. Это правило называется инкапсуляцией.
Чаще всего инкапсуляция выполняется посредством сокрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение.
Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.
В Object Pascal ограничение доступа к полям объекта реализуется при помощи свойствобъекта. Обычно свойства характеризуются 3 элементами:
Полем, хранящим значение свойства, ии двумя методами: методом записи свойства(write); и методом получения значения свойства -метод чтения свойства(read)).
В описании класса перед именем свойства записывают слово Property. После имени указывается его тип, затем имена методов, обеспечивающих доступ к значению свойства. После словаReadуказывается имя метода, обеспечивающего чтение свойства, после словаWrite– чтение. Ниже приведен пример описания классаperson, содержащий два свойства:NameиAddress.
Type
TName=string[15]
TAddress=string[30]
person=class
FName: TName;
FAddress: TAddress;
Construction Create (Name: TName);
Function GetName: TName;
Property Name: TName read GetName;
Function GetAddress: TAddress;
Procedure SetAddress (NewAddress: TAddress);
Property Address: TAddress
read GetAddress
write SetAddress;
end;
В программе для установки значения свойства совсем не обязательно записывать инструкцию применения метода к объекту, можно записать обычную процедуру присваивания
Т.е. вместо
secret.SetAddress('Луговая 9-12')
Следует писать
secret.address:=’Луговая 9-12’
Очевидно, что внешне использование свойства в программе ничем не отличается от использования полей объекта.
Однако в программе на методы свойства можно возложить некоторые дополнительные задачи. Например, метод может проверить корректность присваевымых свойству значений, установить значения других логически связанных со свойством полей, вызвать вспомогательную процедуру.
Оформление поля свойства позволяет ограничить доступ к его значению, например, разрешить только чтение. Чтобы инструкции программы не могли изменить значение свойства в описании свойства надо указать только имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции.
Установить значение свойства, защищенного от записи, можно во время инициализации объекта.
Constructor person.create(Name: TName);
begin
FName:=Name
Address:=’’;
end;
function person.GetName; (метод получения значений св-ва Name)
begin
result:=FName;
end;
function person.GetAddress;
begin
result:=FAddress;
end;
procedure person.SetAddress(NewAddress: TAddress);
begin
if FAddress=’’
then FAddress:=NewAddress;
end;