Property-властивості

Begin

Interface

Туре

АВСЗ = class private

a, b, с: Double; (Всі властивості мають вузьку область

видимості)

public

Procedure SetA(NewA: Double);

(Всі методи мають широку область

видимості)

Procedure SetB(NewB: Double);

Function GetC: Double;

end;

Implementation

Procedure ABC3.SetA(NewA: Double);(Опис метода SetA класу АВС3)

Begin

а := NewA;

с := а * b; end;

ProcedureАВСЗ.SetB(NewB:Double);(Опис метода SetB класу АВС3)

Begin

b := NewB; c := a * b;end;

Function АВСЗ.GetC: Double; (Опис метода GetC класу ABC3)

Result := c; Просто повертаємо значення C)

end; end.

 

Властивості property аналогічні властивостям об'єкта в сенсі їх використання. Однак внутрішній механізм їх роботи набагато складніший. Такі властивості не є простим відображенням пам'яті, доступний для читання і зміни, а мають на увазі виклик методів об'єкта. Детальніше на властивостях property ми зупинимося при розгляді створення компонентів, а поки просто наведемо скорочений формат опису таких властивостей з короткими поясненнями. Отже, опис властивостей property у найпростішому вигляді виглядає таким чином:

property<Ім’я властивості>:<Тип>read <Функція зчитування значення>

write <Процедура установки значення>;

 

Коли викликає підпрограма звертається до властивості property для отримання його значення, замість конкретного значення повертається результат функції, зазначеної на ім'я після модифікатора read. Аналогічно проводиться установка значення властивості - замість прямого запису значення викликається процедура, зазначена після модифікатора write. Відповідно, дана процедура повинна приймати один параметр, причому його тип повинен бути таким же, як тип самого властивості.

Модифікатори read і write можуть не бути присутнім в описі property-властивості одночасно. Якщо для властивості задана функція читання, але не задана процедура запису, то така властивість може бути використано тільки для отримання значення. Були задана процедура встановлення значення, але не задана функція читання, то property-властивість можна використовувати тільки в лівій частині оператора привласнення. У розглянутому нами прикладі властивості а і b повинні бути доступні зухвалому фрагменту і для читання і для запису, тоді як властивість с може бути доступно тільки для читання. Приклад опису та використання property-властивості для підтримки коректності даних приведений в лістингу 2.8.

Лістинг 5.8. Приклад опису та використання roperty-властивосты

Unit Properties; (Заголовок модуля)

Interface

Туре

ABC4 = class private

fa, Bo, fc: Double; (Всі властивості мають вузьку

область видимості)

protected (Всі методи мають область

видимості protected;

Procedure SetA(NewA: Double); {Процедура установки

значення властивості fa)

Procedure SetB(NewB: Double);

(Процедура установки значення властивості fb}

Function GetA: Double; (Функція отримання значення

властивості fa)

Function GetB: Double; ( Функція отримання значення

властивості fb)

Function GetC: Double; ( Функція отримання значення

властивості fc)

published •Розділ опису property-властивостей, доступних викликаю чому фрагменту програми)

property A: Double read GetA write SetA;

(Опис property-властивості А, для якого задана функція читання GetA та процедура установки SetA. Властивість буде доступна викликаю чому фрагменту програми для читання та запису)

property В: Double read GetB write SetB;

{Опис property- властивості В, для якого задана функція читання GetB та процедура установки SetB. Властивість буде доступна викликаю чому фрагменту програми для читання та запису)

property С: Double read GetC;

(Опис property- властивості С, для якого задана функція читання GetС та не задана процедура установки. Властивість буде доступна викликаючому фрагменту програми виключно для читання)

end;

Implementation

Procedure АВС4.SetA(NewA: Double); (Опис метода SetA)

Begin

fa := NewA; (Занесення нового значення в private-властивість fa)

fc := fa * fb; (Перерахунок добутку та занесення результату у властивість fc)

end;

Procedure АВС4.SetB(NewB: Double); (Опис метода SetB)

Begin

fb := NewB; (Занесення нового значення в private-властивість fb)

fc := fa * fb; (Перерахунок добутку та занесення результату у властивість fc)

end;

Function ABC4.GetA: Double; (Опис метода GetA)

Begin

Result := fa; (Результата функції - значення private - властивості fa)

end;

Function ABC4.GetB: Double; (Опис метода GetB)

Begin

Result := fb; (Результата функції - значення private - властивості fb)

end;

Function ABC4.6etC: Double; (Опис метода GetC)

Begin

Result ;= fc; (Результата функції - значення private - властивості fc)

end;

end. (Закінчення модуля)

 

Таким чином, property-властивості надають можливість перенесення інформаційних властивостей в області класу з вузькою видимістю, і установ підтримують доступ до їх значень через спеціальні методи, але в значно більш зручній формі. Для викликає фрагмента програми не має значення, до звичайного властивості він звертається, або до property-властивості, тоді як клас має можливість підтримання внутрішньої цілісності.

Зауважимо, що замість функції читання і процедури установки може бути зазначено одне із звичайних властивостей, незалежно від його області видимості. У розглянутому прикладі таку можливість слід застосувати при описі property-властивостей а, b і з, вказавши замість функцій читання властивості fa, fb і fc, відповідно.