Інкапсуляція і властивості об’єкта

Під інкапсуляціей розуміється приховування полів об’єкта з метою забезпечення доступу до них тільки за допомогою методів класу.

У мові 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 ';