Відмінності абстрактного класу від інтерфейсу

Full-stack developer (Symfony, Angular)

У чому відмінність абстрактного класу від інтерфейсу в Java?

Все впирається в поняття "тип". У минулі часи, тобто за часів мови Simula, з якого черпали натхнення творці C ++, були лише класи. І на класах базувалася система типів. Причому механізм успадкування був реалізований так, як реалізований, виключно для економії пам'яті, яка в ті часи була дуже дорогою.

Для того щоб досягти поліморфізму, ми повинні мати можливість оголошувати абстрактні типи. Мовляв "будь-яка хрень яка має такий тип буде працювати як треба". Тому в мовах типу C ++ з'явилися абстрактні класи. Оскільки іноді нам хочеться робити композицію абстрактних типів, в C ++ реалізували множинне спадкування.

В Java, яка багато в чому черпала натхнення з C ++ і smalltalk, вирішили ввести ще одну сутність - інтерфейси. Це був свого роду спрощений спосіб задати абстрактний базовий тип. За підсумком щоб не вирішувати проблему діаманта (або ромба) від множинного успадкування було вирішено відмовитися і дати можливість класам імплементіть кілька інтерфейсів.

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

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

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

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

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

Спадкування шкідлива штука і його краще по можливості уникати.