Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка_ООТ.doc
Скачиваний:
4
Добавлен:
28.05.2015
Размер:
126.46 Кб
Скачать

Инкапсуляция

Как правило, объект – это сложная конструкция, свойства и поведение составных частей которой находится во взаимодействии.

Например, при моделировании взлетающего самолета, после набора им определенной скорости и отрыва от земли принципы управления им полностью изменяются. Поэтому в объекте «самолет» явно недостаточно просто увеличить значение поля «скорость» на несколько км/ч – такое изменение должно автоматически повлечь за собой целый ряд других.

Классическое правило объектно-ориентированного программирования утверждает, что для обеспечения надежности нежелателен прямой доступ к полям объекта: чтение и обновление их содержимого должно производится посредством вызова соответствующих методов. Это правило называется инкапсуляцией.

Чаще всего инкапсуляция выполняется посредством сокрытия информации, то есть маскировкой всех внутренних деталей, не влияющих на внешнее поведение.

Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации.

В 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;