Створення користувальницьких класів в Access, Інші СУБД, Бази даних, статті

Загальні визначення


Спочатку визначимося: що ж таке об’єкт в розумінні об’єктно-орієнтованого програмування. У самому простому (життєвому) розумінні об’єкт – Це якась річ, і так само як і в навколишньому світі, об’єкт має властивості (“камінь твердий”) і операції, які виконуються над цими властивостями (камінь можна розбити). Майже так само йде справа і з об’єктами в світі програм. Наприклад, як об’єкт можна розглядати файл, в якості властивості – його розмір або ім’я, а в якості операцій – читання або запис. Отже, є об’єкт і є властивості – Що ж є операцією? Будь користувальницька процедура або функція, що змінює або просто працює з властивостями об’єкта. Наприклад, процедура ініціалізації полів запису або процедура виведення на екран значення полів. Виникає природне бажання об’єднати дані і способи їх обробки в одне ціле, так щоб було ясно, які процедури призначені для обробки певних даних. Таким чином, ми впритул підійшли до центральних понять об’єктно-орієнтованого програмування – поняттям інкапсуляції і класу.


Інкапсуляція і класи


Об’єктно-орієнтоване програмування (далі ООП) – найбільш популярна в даний час методологія програмування, що є розвитком структурного програмування. Центральною ідеєю ООП є інкапсуляція, тобто структурування програми на модулі особливого виду, що поєднують дані і процедури їх обробки, причому внутрішні дані модуля можуть бути оброблені тільки передбаченими для цього процедурами. У VBA прийнято назву модуль класу або просто клас. Кожен клас має внутрішню частину, звану реалізацією, і зовнішню частину, звану інтерфейсом.
Клас таким чином, являє собою новий тип даних, що дозволяє створювати нові змінні цього типу – об’єкти (Іноді їх ще називають екземплярами класу). Об’єкт складається з елементів, які можуть бути як власне даними, т. е. значеннями певного типу даних, так і функціями, що реалізують операції над елементами – даними. Елементи – дані називаються властивостями класу, елементи – методами класу. Такий опис служить шаблоном для створення в програмі конкретних екземплярів (об’єктів) даного класу, свої конкретні імена.


Вбудовування


Крім інкапсуляції, ООП на VBA характеризується ще одним важливим властивістю – вбудовуванням. Вбудовування – це механізм породження нових класів з використанням існуючих. Нехай побудований клас А, тоді при оголошенні нового класу В його властивостями можуть бути об’єкти класу А. У цьому випадку говорять, що клас А вбудований в клас В, І клас А є батьком, а клас В – Нащадком. Вбудовування – транзитивне відношення, тобто можна створити довільно довгий ланцюжок вкладених об’єктів, що утворюють ієрархію батьків і нащадків. Так, в новий клас З можна вбудувати об’єкт класу В, Який є об’єктом класу А. Для додатків Office XP характерна ситуація, коли необхідно вказати 6 – 8 рівнів вкладеності, щоб дістатися до потрібного об’єкта. Наприклад, щоб приховати панель інструментів Стандартна в документі Word, Необхідно виконати наступне присвоювання:


Word.Application.ActiveDocument.CommandBars(2).Visible = False


Механізм вбудовування дуже зручний і природний. Прабатько сімейства класів може задавати деякі фундаментальні властивості і методи, а численні нащадки, маючи батьківські корені (властивості і методи), привносять власні вузькоспеціальні властивості та методи.


Спадкування


Поряд зі вбудовуванням, є ще один спосіб використовувати існуючі класи при створенні нових, він називається спадкуванням. При спадкуванні вказується, що новостворюваний на основі класу А клас В містить всі (або деякі) методи і властивості класу А, А також свої власні методи і властивості. Різниця між вбудовуванням і спадкуванням тільки синтаксичне. При вбудовуванні, використовуваному в VBA для посилання на метод або властивість вбудованого класу, ми використовуємо ім’я поля цього класу. При спадкуванні (характерному для С і C + +) ім’я властивості або методу батьківського класу можна використовувати безпосередньо.


Створення класу


Синтаксично класи в VBA оформляються у вигляді спеціальних модулів класів (ім’я класу – це ім’я модуля), де в розділі Declarations поміщається опис властивостей (змінних) класу, а далі йде опис методів (процедур) класу. Синтаксично опису властивостей і методів практично не відрізняються від опису звичайних змінних і процедур. Випадки відмінності або особливостей вживання будуть обговорені окремо. Для створення модуля класу в Access необхідно у вікні бази даних виконати наступні дії:


Insert – Class Module – “Ім’я класу”


Слід вибрати для класу таке ім’я, яке легко буде розпізнаватися, і відображати інформацію про те, які об’єкти описує даний клас об’єктів.


Процедури класу


В Access всі процедури класу діляться на три групи:



  1. процедури – методи
  2. процедури – властивості
  3. процедури – реплікації на події


Процедури – методи


Синтаксис оголошення таких процедур не відрізняється від стандартного, за винятком використання ключового слова Friend. Ключове слово Friend, Як і ключові слова Private і Public, Призначено для обмеження області видимості методу. Якщо Private робить метод видимим тільки всередині модуля, a Public – Для всіх модулів всіх проектів, то Friend займає проміжну позицію між ними: він робить видимим метод тільки в тому проекті, де був описаний клас.



Процедури – властивості


Як відомо, визначення класу в VBA складається з двох розділів: реалізації та інтерфейсу. Одна з найбільш важких завдань для програмістів – новачків у ООП полягає у визначенні того, які члени класу робити закритими (включати в розділ реалізації), а які, навпаки, відкритими (включати в розділ інтерфейсу). Загальним правилом можна вважати те, що чим менше програмі відомо про реалізацію класу, тим краще, тобто бажано приховати за допомогою ключового слова Private як можна більшу кількість властивостей класу в розділ реалізації, а доступ до властивостей здійснювати через спеціальні Public – Методи, що організують інтерфейс класу.
Приховування інформації (інкапсуляція) – Це приховування деталей реалізації функцій, класу чи навіть програми. В умовах приховування інформації програміст працює з функціями і класами як з чорними ящиками. Іншими словами, передаючи функції деяке значення у формі вхідного параметра, програміст знає лише результат, який буде отриманий на виході цієї функції. Приховування інформації в реалізаційну частину класу і доступ до неї через функціональний інтерфейс підвищує надійність програми. Є два способи створення властивостей:



  1. Простіший з них полягає у створенні в розділі описів модуля класу змінної, оголошеної за допомогою ключового слова Public. Таким чином, користувачі об’єкта отримають можливість встановлювати і отримувати значення, яке зберігається в цієї змінної. (Іншими словами, властивість доступно як для читання, так і для запису). Ім’я змінної визначається ім’ям властивості, яке використовується у вашій програмі, тому, як і у випадку імен класів, слід застосовувати імена, що відображають вміст змінних. Хоча використання загальних змінних для визначення властивостей є найпростішим способом, у нього є декілька недоліків:

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


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


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


  2. Для того щоб впоратися з цими недоліками, слід використовувати другий спосіб створення властивості, а саме, створення властивості за допомогою процедури Property, Їх всього три: Property Let, Property Set, Property Get. Розглянемо їх докладніше:

    Property Let – Процедура запису, яка дозволяє присвоювати властивості нові значення


    [{Public / Private / Friend}] [Static] Property Let імяПроцедуриСвойства ([спісокПараметров] значення)
    [БлокОператоров1]
    [Exit Property]
    [БлокОператоров2]
    End Property


    Синтаксис простий і зрозумілий. Спочатку йдуть оператори оголошення видимості процедури – властивості і необов’язкове ключове слово Static. До речі, хоча використання ключового слова Private допустимо, його присутність зводить нанівець сенс процедури – властивості.


    імяПроцедуриСвойства – Це ім’я процедури, що змінює властивість. До речі, бажано, щоб ім’я повторювалося у всіх трьох процедурах-властивості, якщо вони мають справу з одним і тим же властивістю.


    СпісокПараметров – Це список додаткових параметрів, що беруть участь у процедурі. Синтаксис списку параметрів абсолютно такий же, як і у списку до звичайної процедури. Зверніть увагу на те, що всі три процедури-властивості, мають одне і те ж ім’я, зобов’язані мати однаковий список параметрів.


    значення – Це самий важливий обов’язковий параметр, значення якого передається властивості.


    Далі йде блокОператоров, В якому слід провести присвоювання значенням властивості значення фактичного параметра значення.


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


    [{Public I Private / Friend}] [Static] Property Set імяПроцедуриСвойства ([спісокПараметров] ссилкаНаОб’ект)
    [БлокОператоров1]
    [Exit Property]
    [БлокОператоров2]
    End Property


    Тут тільки одна відмінність від попередньої процедури: замість параметра значення, варто параметр ссилкаНаОб’ект, Який представляє ім’я посилання на об’єкт, що привласнюється властивості – засланні.


    Property Get – Процедура читання (а точніше, функція), яка дозволяє зчитувати значення властивості. Ця процедура застосовна як до простих властивостями, так і до властивостей-посиланнях.


    [{Public I Private / Friend}] [Static] Property Get імяПроцедуриСвойства
    ([СпісокПараметров]) As ТіпДанних
    [БлокОператоров 1]
    [ІмяПроцедуриСвойства = вираз]
    [Exit Property]
    [БлокОператоров 2]
    End Property


    Як видно, Property Get – Це функція, і для неї діють всі синтаксичні правила функцій. Нагадаємо лише одне: тип значення, що повертається функцією, повинен збігатися з типом значення виразу.


Реалізація класу


Визначивши клас, задавши йому кілька властивостей і методів, можна використовувати його в програмі VBA. Але для цього спочатку необхідно створити новий екземпляр класу. Неможливо просто посилатися на змінні або викликати процедури модуля класу таким чином, як це робиться в стандартному модулі: VBA видасть помилку компіляції “Подпроцедура або функція не знайдена”, так як можливості знайти процедуру в глобальному просторі імен не існує. Процедура залишиться “прихованої” до тих пір, поки ви не створите новий екземпляр класу, і тоді можна викликати її тільки як метод створеного екземпляра класу. Для створення нового екземпляра класу потрібно оголосити об’єктну змінну, яка використовується для зберігання посилання на створений екземпляр класу. Для змінних, що застосовуються для посилання на користувальницькі класи, діють ті ж правила, що і для змінних, що посилаються на об’єкти VBA або програми. Їх можна описати, використовуючи зарезервовані слова Dim, Private, Public і Global. Наступним кроком є ​​створення нового екземпляра об’єкту і збереження посилання на нього в змінної. Для цього використовується оператор Set в поєднання з ключовим словом New.


Реалізація класу. Ім’я класу User, Ім’я екземпляра класу tmpuser.


Dim tmpuser As User
Set tmpuser = New User


Зауважте, що типом даних в цьому прикладі є ім’я класу, яке було визначено раніше. Хоча такий синтаксис може здатися надмірною, для створення нового екземпляра об’єкта обов’язково потрібно використовувати ключове слово New в операторі Set. Якщо цього не зробити, то при спробі застосувати будь властивість або метод цього класу, VBA видасть повідомлення про помилку виконання 91 – “Не задана об’єктна змінна або мінлива блоку with“. Для створення нового екземпляра об’єкта простого опису об’єктної змінної за допомогою оператора Dim недостатньо.


Неявне створення екземпляра класу


Оголошення змінної і створення нового екземпляра класу можна об’єднати в одному операторі. Ось як це буде виглядати:


Dim tmpuser As New User


Після такого оголошення змінну можна відразу використовувати, звертаючись до властивостей і методів об’єкта, на який вона вказує. При цьому сам об’єкт створюється не оператором Dim, А пізніше, при першому зверненні до змінної. Хоча описаний спосіб неявного створення об’єктів і зручний, оскільки дозволяє заощадити один рядок коду, він має один недолік: через те що в складному додатку ви не знаєте точно, коли буде створений об’єкт, налагодження такого додатка може бути утруднена. Тому рекомендується завжди створювати об’єкт явно, за допомогою окремого оператора Set New.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*