Зараз обговорюють

"Тобто є ряд завдань, які взагалі без рекурсії не наважуються."  - це як розуміти? Перефразуй, будь ласка. 

виправив, йшлося про те що деякі завдання можна вирішити лише при використанні рекурсії

Спасибі дуже корисна стаття

А ще щось планується подібного найближчим часом?


Дякую за підтримку, радий що Вам сподобалось!

Так маю вже майже дороблений проект по управлінні Audio файлом, на заміну стандартним клавішам управління HTML5, але ще не встиг відтестувати програвання файлів з інтернету, поки лише локально працює

Надіюсь найближчим часом дороблю й закину

Рахунки

webmoneyeur - E385818210641
usd - Z304643423050
uah - U354026817492
rub - R301704373231easypay80002677bitcoin1F5HRGroUtEQW9HBNbeew8iKh5KQ8vJxzw

Зворотній зв'язок

Для покращення роботи сайту надсилайте свої зауваження:
mailЗауваження
mailПропозиція

Статистика

UkrNET - поисково-информационный ресурс

VBA : Об'єктно-орієнтоване програмування (ООП). Робота з модулями класів

Багато напевно чули про модулі класів, але не всі їх використовують. Насправді досить велика кількість людей, що пишуть код на VBA за весь час програмування прекрасно обходяться без застосування модулів класів використовуючи лише, так зване, процедурне програмування (процедури та функції). Оскільки VBA не є мовою об'єктно-орієнтованого програмування (ООП) в строгому сенсі слова, то призначені для користувача класи тут не обов'язкові і як наслідок не так вже й часто використовуються при розробці. При цьому використовується доступ до об'єктної моделі Excel або інших додатків.

Дані та підпрограми (функції і процедури) функціонально не пов'язані між собою. Це означає, що оголошуючи змінну «кількість студент» на рівні модуля, можна задати їй різні значення для двох процедур.

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

Клас - складний тип даних, в якому описується структура об'єкта.

Об'єкт - основний будівельний матеріал для написання програм. Відмінні представники об'єктів - форма, лист, книга, діаграма. Об'єкт, створений на основі класу, можна називати екземпляром класу.


Структура класу

Поле - елемент класу для зберігання даних.

Властивість - елемент класу для зберігання даних з можливістю їх обробки. Являє собою характеристики (атрибути), властиві об'єктам (наприклад, розмір шрифту, назва і ін.).

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

Подія - сигнал при зміні стану об'єкта, наприклад виконання методу або зміни даних.


Принципи ООП

Абстракція - це спосіб виділити набір значущих характеристик об'єкта, виключаючи з розгляду незначущі. Відповідно, абстракція - це набір всіх таких характеристик.

Наприклад нам потрібно змоделювати поведінку автомобіля, отже нас цікавить її розміри, вага, швидкість яку може розвинути, привід (передній, задній чи 4х4), інші показники в даному випадку нас не цікавлять. Якби для моделювання поведінки автомобіля доводилося враховувати хімічний склад фарби кузова і питому теплоємність лампочки підсвічування номерів, ми ніколи б не дізналися, що таке NFS.

Інкапсуляція - це властивість системи, що дозволяє об'єднати дані і методи, що працюють з ними, в класі і приховати деталі реалізації від користувача.

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

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

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

Поліморфізм - це властивість системи використовувати об'єкти з однаковим інтерфейсом без інформації про тип і внутрішню структуру об'єкта.

Наприклад будь-яке навчання водінню не мало б сенсу, якби людина, яка навчилася водити, скажімо, ВАЗ 2106 не міг потім водити ВАЗ 2110 або BMW X3. З іншого боку, важко уявити людину, яка змогла б нормально керувати автомобілем, в якому педаль газу знаходиться лівіше педалі гальма, а замість керма - джойстик.

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

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

Спадкування - це властивість системи, що дозволяє описати новий клас на основі вже наявного з частково або повністю позиченою функціональністю. Клас, від якого виробляється спадкування, називається базовим або батьківським. Новий клас - нащадком, спадкоємцем або похідним класом.

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

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

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

В VBA реалізовані: Абстрагування і Інкапсуляція, через Implements можна добитись Поліморфізму, а через вбудування об'єктів можна отримати подобу Спадкування. Отже VBA не в змозі реалізувати усі 4 принципи ООП в повній мірі, як C# чи JAVA, але забезпечує нам зручний інструмент для більшої маневреності при написанні коду для виконання своє першочергової мети автоматизації додатків!.


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

Для створення класу в VBE виберіть в меню Insert рядок Class Module. Назвіть створений клас шляхом перейменування створеного модуля, щоб назва як найкраще характеризувала даний клас (Car, Duck, Student). У властивостях класу, крім імені так само є параметр Instancing. Вказується, чи буде видно клас з іншої книги при установці посилання на дану книгу. При установці Private (за замовчуванням) клас видно тільки в даній книзі, при установці PublicNotCreatable, класу не буде доступний з іншої книги, проте екземпляр класу доступний буде, якщо він створений в даній книзі.


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

Клас - це всього лише опис об'єкта. Для використання можливостей класу, необхідно створити екземпляр класу (об'єкт). Існує кілька способів:

Оголошення класу в тілі процедури:

Sub Test()
	Dim myObj As ExampleClass
	Set myObj = New ExampleClass
End Sub 

Оголошення класу на рівні модуля:

Dim myObj As ExampleClass
Sub Test()
	Set myObj = New ExampleClass
End Sub 

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

Примітка: При заміні Dim на Public екземпляр класу доступний у всьому проекті, якщо оголошується поза об'єктного модуля.

Оголошення класу з подіями:

Dim myObj WithEvents As ExampleClass
Sub Test()
	Set myObj = New ExampleClass
End Sub 

Якщо в класі описані події об'єкта, вони будуть доступні.

Примітка: Працює тільки при оголошенні в об'єктному модулі (модуль класу, форми, листа, книги)

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

Sub Test()
	Dim myObj As New ExampleClass
End Sub 

У цьому випадку об'єкт створюється при першому зверненні до змінної myObj. Напевно, краще спочатку оголошувати змінну (виділяється пам'ять), а потім явно створювати об'єкт.


Знищення екземпляра класу

Природно, після використання примірника класу, необхідно очистити пам'ять. Робиться це одним способом:

Set myObj = Nothing 

Це потрібно робити для очищення пам'яті та відповідно уникнення її переповнення.


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

Створений клас ExampleClass не має полів, властивостей, методів, подій, тому і створений на його основі об'єкт (екземпляр класу) myObj, так само марний.

Поля це змінні класу, оголошені в його модулі. Поля бувають закриті і відкриті. Доступ до закритих полів можливий тільки всередині модуля класу. Відкрите поле, по суті - властивість класу, і при створенні екземпляра класу воно буде доступним.

Створення закритого поля:

Dim Height As Single
або
Private Height As Single 

Створення відкритого поля:

Public Weight As Single 

І тепер властивість Weight є у екземпляра класу myObj і ми можемо записати дані:

myObj.Weight = 72.4
і тепер, щоб прочитати дані
Debug.Print myObj.Weight 

Примітка: Створити поле з призначеним для користувача типом даних не вдасться.


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

Властивість це спосіб доступу до даних всередині об'єкта. Виглядають як поля, однак, це функції (назвемо їх методами). Називаються вони Property Get для читання даних з об'єкта, і Property Let для запису даних в об'єкт. Є ще третій Property Set для установки посилання на інший об'єкт. Але це можна зробити і за допомогою Property Let.

Синтаксис Property Get та Property Let

[Public | Private | Friend] [Static] Property Get ім'я [(аргументи)] As [тип]
'або
[Public | Private | Friend] [Static] Property Let ім'я ([аргументи,] [значення])
	[Довільний код]
	[Ім'я = вираз]
		Exit Property
	[Довільний код]
	[Ім'я = вираз]
End Property 

- Елемент Exit Property означає вихід з методу, і по суті аналог Exit Function. У методі їх може бути кілька.

- Усередині методу Property Get/Let може бути скільки завгодно процедур і функцій, але сам метод не може входити до складу інших процедур і функцій, однойменних методів Property Get/Let в модулі класу бути не може.

Синтаксис Property Set

[Public | Private | Friend] [Static] Property Set ім'я ([аргументи,] посилання)
	[Довільний код]
		[Exit Property]
	[Довільний код]
[End Property] 

- Не забувайте, надіслати адресу за допомогою Set.


Приклади створення властивості в модулі класу Duck:

Private pHealf As Integer
Public Property Get Healf() As Integer
    Healf = pHealf
End Property
Public Property Let Healf(intHealf As Integer)
    pHealf = intHealf
End Property 

Властивість Healf доступно для читання і запису. при цьому під час запису і читанні ніяких модифікацій з даними не проводиться, тобто така конструкція аналогічна відкритому полю (Public Healf as Integer), а тому створення її сенсу не має. Просто зайвий код.


Private pHealf As Integer
Public Property Get Healf() As Integer
    Healf = pHealf
End Property 

Властивість доступна тільки для читання. Метод Property Let не створювалася. Передбачається, що дані змінної pHealf задані в будь-якої процедури модуля класу.


Const pHealf As Integer = 2
Public Property Get Healf() As Integer
    Healf = pHealf
End Property 

Властивість доступна тільки для читання і містить константу. Єдиний спосіб відкриття константи з об'єктного модуля.

Примітка: Конструкція Public Const pHealf As Integer = 2 працювати не буде.


Private pHealf As Integer
Public Property Let Healf(ByVal intHealf As Integer)
    pHealf = intHealf
End Property

Властивість тільки для запису. при спробі його прочитати, з'явиться помилка.


Public Property Let Healf(ByVal intHealf As Integer)
    If intHealf < 2 Then
        pHealf = 2
    Else
        pHealf = intHealf
    End If
End Property 

Відбувається перевірка даних при записі значення.


Private pHealf As Integer
Public Property Get Healf() As Single
    Healf = pHealf / 100
End Property
Public Property Let Healf(ByVal intHealf As Integer)
    pHealf = intHealf
End Property 

Приклад довільного коду в методі Property Get. У властивість Healf записується значення цілим числом, а читається в відсотках.


Private pHealf As Single
Public Property Get Healf(ByVal scaleNumbers As Integer) As Single
    Select Case scaleNumbers
        Case 1
            Healf = pHealf
        Case 2
            Healf = pHealf * 100
    End Select
End Property
Public Property Let Healf(ByVal scaleNumbers As Integer, ByVal sngHealf As Single)
    Select Case scaleNumbers
        Case 1
            If sngHealf > 100 Then pHealf = 100 Else pHealf = Round(sngHealf, 0)
        Case 2
            If sngHealf > 1 Then pHealf = 100 Else pHealf = Round(sngHealf * 100, 0)
    End Select
End Property 

Властивість з аргументом. Аргумент scaleNumbers вказує, в яких одиницях виміру записуються одиниці здоров'я, а в яких зчитуються.


Методи класу

У створеному класі можна створювати процедури і функції. Вони будуть видні в екземплярі класу як методи, якщо вказані як Public і не видно, якщо вказані як Private. Всі процедури і функції, які не планується використовувати як методи, повинні бути Private. Цього вимагає принцип інкапсуляції.

Їх створення нічим не відрізняється від створення процедур і функцій в звичайному модулі. Процедури, як і функції, можуть містити обов'язкові і не обов'язкові аргументи. Однак виклик їх відрізняється.

Public Sub DoDamage(ByVal damagePoint As Integer)
    If pHealf >= damagePoint Then pHealf = pHealf - damagePoint Else pHealf = 0
End Sub 

При виклику даного методу буде передаватись певний розмір пошкоджень які необхідно завдати нашому об'єкту.


Події класу

Створений клас вже має дві приховані події:

Class_Initialize - Відбувається при створенні екземпляра класу. У цій події зручно вказувати значення властивостей і змінних за замовчуванням.

Class_Terminate - Відбувається при знищенні екземпляра класу. Примірник класу знищується, коли процедура, в якій він був оголошений, завершує свою роботу. Або після явної де ініціалізації екземпляра класу Set Duck = Nothing

Додавання власних подій в клас, які будуть відбуватися за певних умов, не складає особливих труднощів. Єдина умова - екземпляр класу з подіями повинен (може) бути оголошений тільки в об'єктному модулі (модуль класу, форми, листа, книги) на рівні модуля.


Завантажити файл з прикладом:

Завантажити з Завантажити з


view863like0dislike0 avatard_l4w clock 2016-10-21 00:04

Коментарі:



Для даної статті відсутні коментарі

Про нас

"Programmers World" розроблено з метою полегшення в освоєнні навичок програмування, та поширення матеріалів з сфери ІТ Українською мовою.

Кожен бажаючий може безкоштовно користуватися ресурсами сайту, щоб:

- Вивчати теоретичні аспекти мов програмування

- Переглядати практичне застосування теорії при виконанні різних міні проектів з відкритим кодом

- Розміщати свої завдання на форумі для допомоги в їх реалізації, або готового коду який може бути корисний іншим користувачам

- Спілкуватись з іншими користувачами та обмінюватись досвідом

Сайт функціонує на безопланій основі та ентузіазмі розробника, якщо Ви бажаєте долучитись до розвитку даного проекту то можете пожертвувати кошти на рахунки розміщені в блоці "Допомога сайту".

Сайт

Зареєстровані користувачі можуть скористатися системою діалогів, в профілі користувача, для отримання потрібної інформації. Написати!

Також Ви можете використати форми відправки Зауважень та Пропозицій.


Електронна пошта

Ви можете звертатись на нашу поштову скриньку site.programmersworld@gmail.com

www.000webhost.com