Що таке абстрактний клас? Чим інтерфейс відрізняється від абстрактного класу. Приклади реалізації абстрактного класу і інтерфейсу в perl. Використання Class :: Interface
Абстрактний клас в ООП - це базовий клас, що не передбачає створення своїх примірників. Абстрактний клас може містити абстрактні методи і атрибути.
Абстрактний клас є яскравою демонстрацією одного з основних принципів ООП - поліморфізму.
У деяких мовах програмування використання абстрактних класів заборонено. У деяких - дозволено. Perl, як завжди, посередині. У ньому можна реалізувати абстрактний клас стандартними можливостями мови. Але в ньому немає спеціальних конструкцій для цього, як, наприклад, в PHP або Java.
Абстрактний клас в PHP:
Використання абстрактних класів зручно тим, що можна розмістити в цьому класі всі функції і методи, які будуть потім потрібні у великій кількості інших класів. Абстрактний клас - це відмінне рішення, яке рятує від дублювання коду.
Навіщо потрібні абстрактні класи і інтерфейси
Припустимо у вас є програма, яка завантажує з віддаленого сервера файли і обробляє їх.
Спочатку ви завантажуєте прості txt-файли, читаєте дані, зберігаєте їх в БД, потім переносите файл в директорію з обробленими файлами. Для обробки файлів ви використовуєте спеціальний клас Document.
Потім приходить ваш клієнт і каже, що через місяць треба буде обробляти не тільки txt-файли, але і xml. А ще через пару місяців додається doc і pdf. Якщо txt і xml ще чимось схожі, то обробка doc і pdf вже сильно виділяється із загального потоку. Тепер ви створюєте для обробки кожного документа свій клас: DocumentXML.pm. DocumentPDF.pm і т.п. Починає дублюватися код. З'являється плутанина в обробниках. Зрештою ви викликаєте метод для роздруківки csv-файлу і програма падає, тому що ви забули додати в DocumentCSV.pm метод printer ().
Найрозумнішим в даному випадку, буде перетворити Document.pm в інтерфейс, який буде задавати список методів, обов'язкових до визначення в кожному підкласі. При цьому, клас-інтерфейс буде абстрактним класом, і його екземпляри в процесі роботи програми створюватися не будуть.
Тепер, якщо ми забули вказати якийсь метод, це стане ясно при першій же спробі запуску програми.
Більш того, якщо деякі методи будуть загальними для всіх підкласів, можна визначити їх в абстрактному класі. Наприклад, методи копіювання та перенесення файлів з різних тек, або пересилання поштою і т.п.
Реалізація інтерфейсів і абстрактних класів в Perl за допомогою Class :: Interface
Class :: Interface - зручний модуль, який допомагає зробити реалізацію інтерфесом і абстрактних класів в perl справою простим і приємним.
Moose. до речі, теж дозволяє спростити реалізацію інтерфейсів. Приклад з Moose вже наводився вище. Але Class :: Interface. на відміну від Moose. невеликий і простий модуль, а не складна і важка система.
Для створення абстрактних класів і інтерфейсів, модуль надає 4 підпрограми:
- # 038; interface () - перетворює викликав її клас в інтерфейс.
- # 038; implements () - завантажує інтерфейс, ім'я якого передається в якості параметра, і перевіряє викликав клас на наявність всіх необхідних методів.
- # 038; abstract () - перетворює викликав клас в абстрактний.
- # 038; extends () - завантажує дані зазначеного абстрактного класу і перевіряє викликає клас на наявність абстрактних методів.
Для створення інтерфейсу необхідно, щоб:
Для створення абстрактного класу необхідно, щоб:
- було зазначено use Class :: Interface;
- була викликана підпрограма # 038; abstract ()
- була оголошена хоча б одна підпрограма