Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Візуал Бейсік 2010 Глінський.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.12 Mб
Скачать

§ 32. Поняття про об’єктно-орієнтоване програмування

У цьому параграфі розглянемо основні поняття об’єктно-орієнтованого програмування (ООП): клас об’єктів користувача, інкап­суляція, успадкування, поліморфізм, конструктор, деструктор.

1. Поняття про різні стилі програмування. У попередніх параг­рафах ми розв’язували задачі шляхом створення проектів засобами візуального середовища. На стадії проектування форми користувач оперував стандартними об’єктами (елементами керування) і посила­вся на них у своїх кодах. Він використовував об’єкти лише для ство­рення графічного інтерфейсу проекту.

Коли користувач вставляв на форму кнопку чи інший елемент керування, змінював їхні властивості у конструкторі, середовище розробки відстежувало кожну його дію і автоматично створювало код інтерфейсної частини проекту. Цей код є зразком об’єктно-орієнтованого програмування. Він зазвичай захований від користу­вача, але його можна переглянути, відредагувати і навіть створити «вручну», відкривши інтерфейсну частину проекту.

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

Об’єктно-орієнтоване програмування (ООП) —- це більш загаль­ний підхід до розв’язування задач передусім на стадії моделювання. Розглядають об’єктно-орієнтоване моделювання (аналіз) і об’єктно-орієнтоване проектування тощо.

Моделювання є найважливішим етапом. Моделюють цілі пред­метні області. В ООП декомпозицію задач реалізують не створенням окремих процедур, а створенням класів. Класи споріднених об’єктів групують у бібліотеки. Приклад бібліотеки класів — .NET Frame­work Class Library від Microsoft. Класи з цієї бібліотеки ми і вико­ристовували для розв’язування поточних задач.

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

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

Class <назва класу>

<оголошення полів (властивостей)>

<оголошення методів>

End Class

Метод — це код розв’язування деякої задачі чи її частини.

Отже, опис класу фактично містить код розв’язування деякої за­дачі чи підзадачі.

Твердження. Будь-яку з раніше написаних програм у стилі ПОП можна формально переписати у стилі ООП.

Покажемо, як це зробити.

Задача 1. Відомо рік народження студента і середній бал за ми­нулу сесію. Вивести, який вік студента і повідомлення, чи отриму­ватиме він стипендію (нехай умовою надання стипендії є середній бал більший-рівний, ніж 71 (зі 100)).

Розв’язування. Клас student змоделюємо трьома властивостями: прізвище (name), рік народження (year), бал (bal), а також двома ме­тодами: визначення віку (age) і створення повідомлення (tell) з таки­ми значеннями: "Стипендія є" або "Стипендії немає".

Class student

Public name As String

Public year As Integer

Public bal As Integer

Sub age(ByRef vik As Integer)

vik = 2012-year 'якщо тепер 2012 рік

End Sub

Sub tell(ByRef p As String)

If bal >= 71 Then

p = "Стипендія є"

Else

p = "Стипендії немає"

End if

End Sub

End Class

Слово Public оголошує загальнодоступне (незахищене) поле класу, а Dim чи Private — приватні (захищені) поля класу. Поле і властивість — це синоніми.

Складемо головний код користувача без інтерфейсної частини. Цей код використовує клас student:

Sub Main()

Dim vik As Integer Dim p As String

Dim studl As student 'Оголошення намірів створити об’єкт

studl = New student 'Створення об’єкта командою New

studl.name-’Квакін” 'Заповнення полів

studl.year = 1995

studl.bal = 80

studl .age(vik) 'Звертання до методів за результатами

studl .tell(p)

Debug.WriteLine(stud1.name) 'Виведення результатів у VB

Debug.WriteLine(vik)

Debug.WriteLine(p)

End Sub

Усі команди знайомі. Розглянемо їх. Команда Dim studl As student оголошує про намір створити об’єкт типу student. Комп’ютер на цьо­му етапі з’ясовує, що таке об’єкт student, чи є доступ до класу student і чи він правильно описаний.

Команда studl = New student звертається до конструктора класу і резервує для об’єкта відповідні ділянки в оперативній пам’яті. Тільки тепер «народився» об’єкт (об’єкт створено). Але він порож­ній і не містить конкретних даних. Наступні три команди запов­нюють поля об’єкта. Цей процес називають ініціалізацією об’єкта. Далі у коді звертаються до методів об’єкта, отримують потрібні ре­зультати і виводять їх у вікно інтерпретації.

Завдання 1. Виконайте код і переконайтеся, що результати бу­дуть такі:

Квакін

17

Стипендія є.

Завдання 2. Створіть графічний інтерфейс для задачі 1.

Завдання 3. Модифікуйте будь-який код розв’язування задачі про трикутник у стилі ООП.

3. Конструктор і деструктор. Конструктор — це процедура, яка призначена для ініціалізації (надання значень полям) об’єкта. У вищенаведеному коді команда New зверталася до стандартного (неяв­ного) безпараметричного конструктора класу.

В ООП прийнято явно описувати конструктор класу в конструк­ції опису класу. Це дає змогу уникати ініціалізації об’єктів шляхом прямого звертання до їхніх полів так:

studl .name = "Квакін"

stud1.year= 1995

studl .bal = 80 'Це вважається поганим тоном в ООП

Конструктор класу student для задачі 1 запишемо після описів властивостей класу. Він може мати такий, наприклад, вигляд:

Sub New(aa As String, bb As Integer, cc As Integer)

Me.name = aa 'Полям об’єкта

Me.year = bb 'надаємо відповідні значення

Me.bal = cc

End Sub

Конструкторів може бути декілька, які відрізняються сигнатурами — списками формальних параметрів. У конструкторі можна передбачити аналіз вхідних даних (aa, bb, сс) на правильність і ви­ведення у разі потреби попередження про їх некоректність чи невід­повідність змісту задачі.

Створивши конструктор, користувач може замінити п’ять ко­манд головного коду такою одною:

Dim studl As student = New student(“Квакін”, 1995, 80).

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

Ці об’єкти займатимуть значні обсяги оперативної пам’яті, що може сповільнити роботу комп’ютера. Пам’ять варто вивільнити від зайвих (уже опрацьованих) об’єктів. Для цього призначені методи-деструктори Finilize або Dispose. Звільнити пам’ять від даних про сту­дента Квакіна можна за допомогою деструктора Finilize так: studl.Finilize.

Як і у випадку конструктора, процедуру деструктора

Sub Finilize()... End Sub

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

Завдання 4. Модифікуйте вищенаведений код, застосувавши явний опис конструктора і деструктора.

4. Успадкування і поліморфізм. У задачах, що розглядалися ра­ніше, можна було виокремити й описати один клас об’єктів: клас студентів, клас трикутників, клас автомобілів тощо. Насправді ре­альну предметну область моделюють за допомогою декількох, а ін­коли й багатьох класів. Між класами можуть бути налагоджені ієрархічні зв’язки на зразок «батьки»-«нащадки». Класи-нащадки, крім власних, можуть використовувати властивості й методи батьків.

Успадкування — це другий важливий принцип ООП, який дає змогу використовувати спільні властивості і методи класів.

Завдяки успадкуванню код опису класу-нащадка стає компактнішим. Успадкування реалізують командою Inherits <назва батьківсько­го класу>, яку записують під заголовком класу-нащадка.

Розглянемо поняття поліморфізму. Різні класи можуть мати ме­тоди з однаковими назвами, але з різним функціюванням (напов­ненням). Нехай а і b — це об’єкти різних класів, що мають метод method1. Тоді в головному коді команди a.methodl і b.method1 викли­чуть різні методи, хоча назви методів однакові. Це називається по­ліморфізмом. Поліморфізм дає змогу подібні за призначенням, але різні за кодами методи в різних класах називати однаковими назва­ми, що, зокрема, забезпечує зменшення загальної кількості назв і процедур. А це важливо у великих проектах.

Нащадки можуть мати власні методи, а також використовувати методи батьків. Якщо нащадок має метод з такою ж назвою, що й назва методу у батьківському класі, то заголовок методу нащадка слід описати зі службовим словом Overrides.

5. Ієрархія класів. Побудуємо нескладну ієрархію класів: бать­ківський клас і два його нащадки. Для цього розглянемо задачу 2.

Задача 2. Дослідити, який місячний фонд зарплати і місячний фонд для виплати стипендій має мати деякий навчальний заклад, якщо стипендію 800 грн виплачують студентам, коли кількість ба­лів більша-рівна 71, а зарплату викладачам виплачують, напри­клад, відповідно до трьох посадових окладів: 1-й — 2000 грн, 2-й — 2500 грн, 3-й — 3000 грн. Потрібно також отримати довідку про середній вік студентів і викладачів. Дані про студентів і викладачів є у файлі даних.

Моделювання. Створимо клас person з такими властивостями: прізвище (name), рік народження (year), явно описаним конструкто­ром з двома параметрами і методом age для визначення віку особи.

Створимо клас-нащадок student з успадкованими від person двома властивостями (прізвище і рік народження), власною третьою влас­тивістю (bal), з конструктором New, який основується на конструк­торі батьківського класу MyBase.new, доповнений командою задания третьої властивості Ьаі і володіє методом salary для визначення суми місячного доходу.

Створимо клас-нащадок teacher з успадкованими від person двома властивостями, власною третьою властивістю (position), що визначає тип окладу (1, 2 чи 3), з конструктором New, який основується на конструкторі батьківського класу MyBase.new, доповнений командою задания третьої властивості position і володіє методом salary для визначення суми місячного доходу.

UML-діаграма класів, що відображає взаємозв’язок між класа­ми, зображена на рис. 2.9.

Рис. 2.9. UML-діаграма класів для задачі 2

Розглянемо спрощену постановку задачі 2 з метою дослідження даних лише одного студента і одного викладача. Побудуємо проект з таким інтерфейсом: розташуємо на формі «Останній проект» вісім написів і кнопку. Підпишемо написи «Студент», «Вік», «Сума», І «Викладач», як показано на рис. 2.10, а інші чотири (в коді вони мають номери 1, 2, 3 і 4) використаємо для виведення результатів пошуку потрібних даних. Виведемо у написи 1 і 2 вік і розмір стипендії студента, що залежить від кількості балів, а в інші два написи (3 і 4) — вік і місячний оклад викладача, що залежить від типу окладу. Вхідні дані на формі не задаємо. Задамо їх (довільно) у коді як фактичні параметри для конструкторів об’єктів (вважати­мемо, що дані взято з файлу даних). Кнопка «Вивести дані» запус­кає процес розв’язування задачі й виведення результатів.

Рис. 2.10. Результат виконання останнього проекту

Програмування. Розгляньте код проекту, що складається з коду кнопки і кодів трьох класів. Коди класів записують під заголовком класу форми Forml перед кодом кнопки.

Public Class Forml

Class person

Public name As String

Public year As Integer

Public Sub New(ByVal aa As String, ByVal bb As Single)

Me.name = aa

Me.year = bb

End Sub 'кінець конструктора

Public Sub age(ByRef z)

z = 2012 – year

End Sub 'кінець методу

End Class 'кінець класу person

Class student

Inherits person 'наслідування

Dim bal As Integer 'власна властивість нащадка

Public Sub New(ByVal aa As String, ByVal bb As Single,_

ByVal cc As Single)

MyBase.new(aa, bb)

Me.bal = cc

End Sub

Sub salary(ByRef sum) 'метод нащадка

If bal >= 71 Then sum = 800 Else sum = 0

End Sub

End Class

Class teacher

Inherits person

Dim position As Integer

Public Sub New(ByVal aa As String, ByVal bb As Single, _

ByVal cc As Single)

MyBase.new(aa, bb)

Me.position = cc

End Sub

Sub salary(ByRef sum)

Select Case position

Case 1 : sum = 2000

Case 2 : sum = 2500

Case 3 : sum = 3000

End Select

End Sub

End Class

' А це код кнопки:

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button1.Click

'Створюємо два об’єкти з даними про двох осіб

Dim studl As student = New studentfKBaKiH", 1995, 80)

Dim teach 1 As teacher = New teacher("BecT", 1965, 2)

Dim p As Single

'Отримуємо шукані результати і виводимо їх

studl.age(p): Label1.Text = p

studl.salary(p): Label2.Text = p

teachl.age(p): Label3.Text = p

teach1.salary(p): Label4.Text = p

End Sub 'кінець коду кнопки

End Class 'кінець класу Forml

Зауваження. Властивості батьківського класу описані як Public (незахищені), оскільки до них мають отримувати доступ об’єкти двох інших класів. Властивості bal і position є приватною власністю відповідних класів, тому їх описують зі словом Dim, що рівносильне Private. Рекомендуємо ознайомитися з методами Get і Set, які дають змогу конструювати захищені поля класу.

Завдання 1. Виконайте проект і переконайтеся, що результат буде такий, як на рис. 2.10.

Завдання 2. Модифікуйте проект, щоб вхідні дані про студента і викладача можна було вводити з форми.

Завдання 3. Модифікуйте проект, щоб всі вхідні дані можна було вводити з файлу даних.

Завдання 4*. Розв’яжіть задачу 2 для десяти студентів і п’яти викладачів, ввівши дані з двох файлів даних у масиви об’єктів.

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

Вправи

  1. Оформіть у стилі формального ООП розв’язування задачі про площу поверхні та об’єм кулі. Для цього створіть власний клас «Куля» з властивістю г (радіус) і двома методами: один — для обчислення пло­щі, другий — для обчислення об’єму. В головному коді сконструюйте об’єкт, ініціалізуйте його і зверніться до його методів за результатами.

  2. Оформіть у стилі ООП розв’язування задачі про трикутник чи іншої задачі з розділу 1.

  3. Побудуйте клас «Студенти» з такими властивостями: прізвище, ім’я, балі, бал2, балЗ, бал4, бал5 у стобальній системі з п’яти іспи­тів і з двома методами: для визначення середнього бала студента; для визначення, чи отримуватиме студент стипендію. Умова отримання стипендії така: середній бал >71.

  4. Побудуйте клас «Студенти2», застосувавши успадкування від класу «Студенти». Новий клас має містити додатково такі властивості: місто, звідки прибув студент на навчання; номер телефону батьків. Створити масив з десяти об’єктів класу «Студенти2», ввівши потріб­ні дані з файлу даних. Створити список прізвищ студентів і телефо­нів батьків, яким має зателефонувати секретар деканату, якщо сту­дент отримав з трьох предметів менше, ніж 50 балів, і може бути ви­ключений.

5*. Створіть клас «Співробітники» з такими властивостями: прізвище, ім’я, оклад, а також з методом обчислення податку, наприклад, 15% від окладу. Створіть масив з десяти об’єктів класу «Співробітники», визначіть фонд зарплатні підприємства і суму сплачених податків за всіх співробітників.

6*. Створіть масив з десяти об’єктів класу «Студенти», ввівши потрібні дані з файлу даних і створіть список з прізвищами студентів, які ма­тимуть стипендію.

7*. Зайдіть в автомобільний салон і розгляньте прайс-лист. Засобами ООП змоделюйте задачу визначення вартості автомобіля залежно від його комплектації. Застосуйте три класи. Батьківський клас має міс­тити описи мінімальної стандартної комплектації, наприклад, салон (тканина, велюр, шкіра), двигун (1.6, 1.8, 2.0), тип кузова (седан, хечбек, спорт). Другий клас має описувати автомобілі з розширеною комплектацією, наприклад, з такими додатковими атрибутами: електропакет (так, ні), люк (так, ні), коробка передач (механіка, авто, комбі). Третій клас має описувати автомобілі з найбільш повною комплектацією, наприклад, скло нічного бачення (так, ні), 3D-акустика (так, ні), непробивна гума (так, ні) тощо. Створіть програму, яка формує замовлення на машину і підраховує її вартість.