Основи обєктно-орієнтованого програмування. Частина перша. Введення

06.09.2015

Основи об’єктно-орієнтованого програмування. Частина перша. Введення

Дата публікації статті: 13.09.2004 16:17

Гайдар Магдануров

Основи об’єктно-орієнтованого програмування

Частина перша. Введення

Дана стаття являє собою введення в об’єктно-орієнтоване програмування (ООП ), а також дає основні відомості про реалізації ООП в Visual Basic .NET і використовується синтаксис і ключових словах. Стаття адресована починаючим програмістам, в незалежності від досліджуваного мови програмування. Також, статтю рекомендується прочитати всім програмістам на Visual Basic переходять на Visual Basic .NET і не мають глибоких знань з ООП. Приклади наведено на Visual Basic .NET.

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

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

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

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

Спробуємо сформулювати визначення об’єкта: «Об’єкт — це деяка унікальна одиниця має свої дані і функції, ці дані обробляють «. (Це моє спрощене визначення, яке ми і будемо використовувати)

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

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

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

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

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

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

Це ще не все, вміст ящика, як я вже сказав, може бути замкнено на ключ і доступно тільки з самого ящика, в термінах ООП це називається закриті або приватні (private) дані.А все, що доступно ззовні називається відкритими або публічними (public) даними.

Тепер напишемо програмний код, що представляє собою наш чорний ящик:

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

Ми створили порожній клас чорного ящика, не містить ні методів, ні властивостей. Тепер заповнимо його вмістом.

Поясню — ми створили клас чорного ящик, що володіє властивостями: Name — назва скриньки, Content — опис вмісту ящика. Значення цих властивостей зберігаються у внутрішніх змінних mBoxName і mBoxContent, недоступних ззовні нашого об’єкта. OpenBox — метод, що відкриває ящик, якому передається параметр — чи потрібно викинути вміст після відкриття чи ні.

Тепер у нас є клас і з нього можна почати створювати об’єкти.

Створимо примірник нашого класу:

Тепер myBlackBox — це посилання на новий екземпляр класу «Чорний ящик». Спробуємо викликати його метод, погратися з властивостями:

Так. Тепер вам зрозумілі принципи роботи об’єкта. Але, тепер ускладнимо ситуацію — в момент створення скриньки на ньому вирізують його назву, після цього що-небудь змінити не можна і назва живе з ящиком все його життя. Значить необхідно заповнити змінну mBoxName в момент створення і не давати можливості змінювати її в подальшому. Для цього існують конструктори — методи класу, які виконуються в момент створення об’єктів і дозволяють заповнити примірник необхідними даними. Найпростіше розглянути цей процес на прикладі. У Visual Basic .NET конструктор — це метод з назвою, ідентичним назві класу.І, що логічно, конструктор не може повертати значень і визначається ключовим словом Sub.

Тепер поведінку класу дещо змінилося:

Ми створили конструктор — метод, що викликається при «народженні» об’єкта, логічно припустити, що є метод, який викликається при знищенні об’єкта. Так, такий метод теж є, він називається деструктором і, на відміну від конструктора, не може бути перевизначено (про перевизначенні методів див. розділ Перевизначення методів ).

У цьому методі виконуються основні дії, пов’язані з знищенням створених усередині об’єкта інших об’єктів, закриттям відкритих дескрипторів файлів, з’єднань з базами даних і багато чого іншого. чим користувався об’єкт за життя. Забувши звільнити використані ресурси в цьому методі, ви створюєте таку неприємну штуку як «витік ресурсів» (тобто, наприклад, ви створили всередині об’єкта, які ще об’єкти, але потім забули їх знищити і вони продовжують займати ресурси (пам’ять) і після знищення вашого основного об’єкта). Правда, варто сказати, що середовище .NET багато бере на себе. Але ми-то з вами вивчаємо ООП, а не конкретну реалізацію .NET.

Скажу кілька слів про такий «корисної речі» перевантаження (перевизначення) методів (methods overloading) — в російськомовній літературі прийнято дослівний переклад — перевантаження, але особисто я волію говорити — перевизначення, що знімає безліч питань новачків. Що це таке? Це можливість створити кілька варіантів одного і того ж методу, що відрізняються набором параметрів. Як приклад використовуємо конструктор нашого улюбленого класу «Чорний ящик».

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

Тепер при створенні екземпляра класу можна використовувати будь-який з двох конструкторів.

Це справедливо для будь-якого методу (Function або Sub), при цьому обчислене значення теж може бути різним.

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

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

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

Так, добре, тепер у нас є готовий клас. Що ж ще цікавого нам дозволяє зробити концепція ООП? Наприклад, ми можемо створити новий клас грунтуючись на цьому, як би успадкувавши всі його властивості і методи. Таким чином, щоб написати новий клас нам не доведеться заново писати код всіх методів і властивостей, достатньо лише внести деякі зміни в існуючий. Але, перш ніж наслідувати нові класи, потрібно зробити декілька змін у існуючому класі і визначити, які методи можуть бути змінені (перевизначені, знову!) у похідному класі (derived). Мабуть, вистачить мучити наш «Чорний ящик», нехай він трохи відпочине, а ми створимо нові класи, один назвемо батьком (Parent), а іншим дочірнім (Child).

Для наслідування використовується ключове слово Inherits, а для того, щоб позначити методи як переопределяемые, використовується ключове слово Overridable.

до Речі, у Visual Studio. після того як ви створите наследованный клас, вам не доведеться заново набирати визначення переопределяемых методів у похідному класі — досить вибрати метод з випадаючого списку Overrides методів (у вікні редагування коду).

Короткий опис статті: об’єктно орієнтоване програмування

Джерело:
Основи об’єктно-орієнтованого програмування. Частина перша. Введення

Також ви можете прочитати