Під інкапсуляціей розуміється приховування полів об’єкта з метою забезпечення доступу до них тільки за допомогою методів класу.
У мові 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 ';