Абстрактний клас і метод: опис, характеристики та особливості. Чим відрізняється абстрактний клас від інтерфейсу
Кожен, хто має хоч мінімальні знання в програмуванні, задавався питанням про те, навіщо існують абстрактні базові класи. Яке їхнє призначення? Як створити абстрактний клас? Які переваги вони дають на практиці? Навіщо вони потрібні в програмуванні і які особливості їх реалізації необхідно враховувати?
абстрактні класи
Так в програмуванні називають одиницю програмного коду, на основі якої не можуть створюватися об`єкти. Слід зазначити, що спадкоємці даного класу можуть бути не абстрактними. Тому створення об`єктів на їх основі є цілком можливим. Якщо розглядати приклад з Java, то побудуємо таку модель: ми можемо описати конструктори в класі А. Але ось скористатися ними ми не зможемо. Виходом з цієї ситуації є оголошення якийсь змінної як посилання. Причому необхідно чітко прописати, щоб вона вказувала на об`єкт класу А. А ось як це можна зробити? У цьому нам допоможе приведення. При цьому необхідно враховувати, що клас-батько завжди вважається більш універсальним, ніж нащадок. У багатьох мовах програмування приведення використовується автоматично. Але якщо немає впевненості в наявності такого механізму, значить, необхідно явно вказати посилання на об`єкт.
абстрактні методи
Що вони собою являють? Абстрактними називають ті методи, які не мають реалізації в розглянутому класі. Так, після круглих дужок (в яких перераховуються використовувані в них аргументи) ставлять не відкривають фігурні (після чого розміщується блок опису методу), а тільки крапку з комою. Таким чином, в даному випадку відсутня інформація про те, що він робить. Тут можна задати питання: "А навіщо метод без реалізації?" Адже він не підлягає використанню! Звичайно, в тому класі, де він був описаний, таке не є можливим. А ось якщо розглядати цю ситуацію з точки зору нащадка, то його можна буде викликати. І функціонувати він буде по конкретному опису, наявного в даному класі.
Особливості абстрактних методів
Існують обмеження в їх використанні. Розглянемо це на прикладі мови програмування Java. Тут є така вимога: якщо в класі є хоча б один такий метод, то він обов`язково повинен бути абстрактним. А в яких випадках доречно використовувати такі конструкції? Давайте розберемося з цим на прикладі класів домашніх тварин. Для початку слід усвідомити, що немає такого звуку, який би видавали вони все. Тому в найзагальнішому класі не задається реалізація методу звучання. Але для нього створюється тіло, яке відокремлено за допомогою блоків. А вже в наступному, коли буде створюватися клас собаки, кота чи хом`ячка, буде прописуватися окремий метод для нього, в рамках якого будуть розкриватися все особливості.
інтерфейс
У програмуванні створено багато інструментів, мета яких - допомогти людині зробити продукт гарної якості. І в рамках даної теми необхідно приділити увагу і цьому аспекту, щоб кожен знав відміну абстрактного класу від інтерфейсу. Так, особливістю останнього є те, що у нього не може бути властивостей, і у методів не визначені тіла. Досліджуючи, чим відрізняється абстрактний клас від інтерфейсу, слід зупинитися ще на одній особливості. Так, перший успадковується, тоді як другий - реалізується. Людині недосвідченому може здатися це несуттєвим. Але справа в тому, що успадковуватися може тільки один клас, а реалізовуватися - хоч греблю гати. Ось чим відрізняється інтерфейс від абстрактного класу. Java має ще ті особливості, що в ньому можуть бути описані виключно абстрактні публічні методи і статичні константи. Але при цьому інтерфейси також можуть успадковуватися. При цьому необхідно вказувати, що використовуються оператори публічні за допомогою public.
Множинне спадкування інтерфейсів
Така функція не є доступною для класів у багатьох мовах програмування (наприклад, в розглянутому нами Java). Це пов`язано з виникненням ряду проблем. Серед таких вказують на неоднозначність, які виникають при спадкуванні. Це і послужило причиною введення множинного спадкоємства інтерфейсів. Це частково вирішує наявні проблеми, але не всі. Так, завдяки принципам інкапсуляції і поліморфізму, інтерфейси можуть бути успішно реалізовані в різних класах за різними методиками (хоча вони і будуть володіти одним і тим же ім`ям). Але не варто забувати і про наявні проблеми. Так, при роботі з декількома інтерфейсами доведеться завжди вказувати, кого ж ми маємо на увазі. Також проблеми будуть і при спробі працювати з двома однойменними методами - в такому випадку ними неможливо буде скористатися. Тому на такі випадки необхідно подбати про наявність загальної реалізації.
абстрактні дані
Це поняття ключове в програмуванні. В даному випадку під абстракцією розуміють незалежний розгляд і розподіл інтерфейсу і його реалізації. Давайте розглянемо приклад. У нас є телевізор, який є об`єктом або модулем. Він має інтерфейс. У цій іпостасі виступають засоби управління ним, а також відтворення звуку і зображення. Чим досконаліший інтерфейс застосовується, тим зручніше телевізор в процесі використання. Ми можемо перемикати програми, натискаючи на якісь кнопки. При цьому немає потреби думати про фізичні процеси в телевізорі. Про них піклуються фахівці, які збирають пристрій. Нас як користувачів цікавлять тільки властивості. Повертаючись до програмування, можна сказати, що ними за такою аналогією є інтерфейс і реалізація. Також, якщо людина впевнена в своїх знаннях, то він може «зняти» кришку у нашого гіпотетичного телевізора і вдосконалити його. Хоча це може призводити до локальних успіхів, в більшості випадків кінцевий результат негативний. Тому в програмуванні підтримується заборона доступу і приховування внутрішніх компонентів для абстрактних даних. Принцип цього механізму передбачає наявність способів запобігання навмисного або випадкового зміни внутрішніх компонентів. І коли говорять про абстрактні типи даних, то мають на увазі їх сукупність з безліччю операцій, які можуть бути виконані над ними.
об`єкти
Ми вже розглянули абстрактний клас і інтерфейс в цілому і загальному. Зараз давайте трохи деталізуємо наші знання. Для початку приділимо увагу об`єктам. Під ними в загальному випадку розуміють частину навколишньої дійсності, яка існує в просторі і часі. Але формально визначити об`єкти в рамках програмування досить складно (з філософсько-теоретичної точки зору). Тому це робиться завдяки його властивостям. Як приклад можна навести таке: об`єкт може бути однозначно ідентифікований (володіє унікальним ім`ям), він знаходиться в певному стані і використовує певну модель поведінки.
спадкування
Оскільки програмування будується на побудові ієрархічного дерева зв`язків між об`єктами, то піднімається питання про те, щоб нижчого типам були передані властивості батьківських бібліотек коду. Під спадкуванням розуміють відносини, коли хтось один повторює поведінку і структуру чогось іншого. У звичайному житті це можна зустріти повсюдно. Подібне було перенесено і в програмування щодо абстрактних елементів. В якості порівняння можна навести той факт, що немає такого організму, як птах. Це абстрактна назва. Як конкретний примірника призводять чайку, солов`я або горобчика. Завдяки наявності успадкування ми можемо використовувати бібліотеки класів, а також розвивати їх для конкретної програми. Такий інструмент дозволяє нам створювати нові об`єкти, попутно доповнюючи або змінюючи властивості вже створеного. Спадкоємець отримує все методи і поля свого предка і при необхідності обзаводиться своїми власними атрибутами. Завдяки тому що є абстрактні елементи і принцип спадщини, існують широкі можливості для модифікації в рамках об`єктно-орієнтованого програмування. До того ж це дозволяє гнучко підходити до вирішення поставлених завдань. При спадкуванні в новий клас передаються дані і функції.
поліморфізм
Він необхідний для того, щоб застосовувати однакові функції для вирішення різних типів завдань. В даному випадку передбачається наявність можливості здійснення різних дій, зміст яких буде залежати від типу об`єкта, з яким ведеться робота. Під поліморфізмом розуміють властивість елементів, які мають одного загального батька, виконувати схожі в смисловому значенні проблеми різними способами. Проведемо аналогію з тваринами. Є така дія - бігти. Всі ми розуміємо, як воно відбувається. Але різними тваринами (левом, слоном, шимпанзе, крокодилом, черепахою) ця дія буде виконуватися по-різному. В даному випадку за їх переміщення відповідає розробник, який при потребі може викликати для конкретного випадку певну підпрограму, розробивши алгоритм і успішно реалізувавши його. Це робиться за допомогою набору методів. При цьому в кожному окремому класі програмістом вказується, якого об`єкту які властивості притаманні. Змінюючи щось в нащадках, можна домогтися виконання певних, потрібних в даному випадку дій. Такий вплив називається поліморфізмом об`єктів. В цілому абстрактний клас є надзвичайно корисним інструментом програмування.