Поля, властивості та методи

Delphi для професіоналів. Об'єктно-орієнтоване програмування

Поля класу є перемінними, оголошеними усередині класу. Вони призначені для зберігання даних під час роботи екземпляра класу (об'єкта). Обмежень на тип полів в класі не передбачено. В описі класу поля повинні передувати методам і властивостям. Зазвичай поля використовуються для забезпечення виконання операцій усередині класу.

Отже, поля призначені для використання всередині класу. Однак клас повинен якимось чином взаємодіяти з іншими класами або програмними елементами програми. У переважній більшості випадків клас повинен виконати з деякими даними певні дії і представити результат.

Властивості є атрибути, які складають індивідуальність об'єкта і допомагають описати його. Наприклад, звичайна кнопка у вікні програми має такі властивості, як колір, розміри, положення. Для екземпляра класу "кнопка" значення цих атрибутів задаються за допомогою властивостей - спеціальним перемінним, обумовленим ключовим словом property. Колір може задаватися властивістю Color. розміри - властивостями Width і Height і т. д.

Так як властивість забезпечує обмін даними з зовнішнім середовищем, то для доступу до його значення використовуються спеціальні методи класу. Тому зазвичай властивість визначається трьома елементами: полем і двома методами, які здійснюють його читання / запис:

function GetColor: TSomeType;

procedure SetColor (ANewValue: TSomeType);

property AColor: TSomeType read GetColor write SetColor;

В даному прикладі доступ до значення властивості AColor здійснюється через виклики методів GetColor і SetColor. Однак в зверненні до цих методів в явному вигляді немає необхідності: досить написати:

і компілятор самостійно відтранслює звертання до властивості AColor в виклики методів Getcolor або Setcolor. Tо є зовні властивість виглядає в точності як звичайне поле, але за всяким зверненням до нього можуть стояти потрібні вам дії. Наприклад, якщо у вас є об'єкт, що представляє собою квадрат на екрані, і його властивості "колір" ви привласнюєте значення "білий", то станеться негайне перемальовування, що приводить реальний колір на екрані у відповідність із значенням властивості. Виконання цієї операції здійснюється методом, який пов'язаний з установкою значення властивості "колір".

У методах, що входять до складу властивостей, може здійснюватися перевірка встановлюваної величини на потрапляння в допустимий діапазон значень і виклик інших процедур, що залежать від внесених змін. Якщо ж потреби в спеціальних процедурах читання і / або запису немає, можна замість імен методів застосовувати імена полів. Розглянемо наступну конструкцію:

function Correct (AValue: Integer): boolean;

procedure SetValue (NewValue: Integer);

property AValue: Integer read FValue write SetValue;

procedure TPropObject.SetValue (NewValue: Integer);

if (NewValueoFValue) and Correct (NewValue) then EValue: = NewValue;

У цьому прикладі читання значення властивості AValue означає просто читання поля rvalue. Зате при присвоєнні значення всередині SetValue викликається відразу два методи.

property AProperty: TSomeType read GetValue;

У цьому прикладі поза об'єктом значення властивості можна лише прочитати; спроба привласнити властивості AProperty значення викличе помилку компіляції.

Для присвоєння властивості значення за замовчуванням використовується ключове слово default.

property Visible: boolean read FVisible write SetVisible default True;

Це означає, що при запуску програми властивість буде встановлено компілятором в True.

Властивість може бути і векторних; в цьому випадку воно зовні виглядає як масив:

property APoints [Index. Integer]: TPoint read GetPoint write SetPoint;

Насправді в класі може і не бути відповідного поля - масиву. Нагадаємо, що вся обробка звернень до внутрішніх структур класу може бути замаскована.

Для векторної властивості необхідно описати не тільки тип елементів масиву, але також ім'я та тип індексу. Після ключових слів read і write в цьому випадку повинні стояти імена методів - використання тут полів масивів неприпустимо. Метод, який читає значення векторної властивості, повинен бути описаний як функція, яка повертає значення того ж типу, що й елементи властивості, і має єдиний параметр того ж типу і з тим же ім'ям, що і індекс властивості:

Аналогічно, метод, поміщає значення в таку властивість, повинен першим параметром мати індекс, а другим - змінну потрібного типу (яка може бути передана як по посиланню, так і за значенням):

procedure SetPoint (Index: Integer; NewPoint: TPoint);

У векторних властивостей є ще одна важлива особливість. Деякі класи в Delphi (списки т-List, набори рядків TStrings) "побудовані" навколо основного векторного властивості (див. Гл. 7). Основний метод такого класу дає доступ до деякого масиву, а всі інші методи є як би допоміжними. Спеціально для полегшення роботи в цьому випадку векторна властивість може бути описана з ключовим словом default.

property Strings [Index: Integer]: string read Get write Put; default;

Якщо в об'єкта є така властивість, то можна його не згадувати, а ставити індекс у квадратних дужках відразу після імені об'єкта:

var AMyObject: TMyObject;

AMyObject [2]: = 'Second'; (Другий спосіб>

Будьте уважні, застосовуючи зарезервоване слово default. - як ми побачили, для звичайних і векторних властивостей воно вживається в різних випадках і з різним синтаксисом.

Уважний читач звернув увагу, що при поясненні термінів "поле" і "властивість" ми використовували поняття методу, і напевно зрозумів його загальний зміст. Отже, методом називається оголошена в класі функція або процедура, яка використовується для роботи з полями і властивостями класу. Згідно з принципами ООП (див. Розд. "Інкапсуляція" далі в цьому розділі), звертатися до властивостей класу можна тільки через його методи. Від звичайних процедур і функцій методи відрізняються тим, що їм при виклику передається покажчик на той об'єкт, який їх викликав. Тому оброблятися будуть дані саме того об'єкту, який викликав метод. На деяких особливостях використання методів ми зупинимося нижче.

Чи знаєте Ви, що процедурна абстракція, процедура - це найбільш відомий в програмуванні тип абстракції. Всякий, хто застосовував для виконання функції підпрограму, реалізовував тим самим процедурну абстракцію. Процедури об'єднують в собі методи абстракції через параметризацію і специфікацію, дозволяючи абстрагувати окрему операцію або подію.

НОВИНИ ФОРУМУ
Лицарі теорії ефіру

Схожі статті