— Привіт, Аміго! Вчора ти слухав лекцію про абстрактні класи. Тепер настав час поглибити наші знання. Хочу навчити тебе правильно користуватися абстрактними класами.

Важко уявити аналогію абстрактного класу у реальному житті. Зазвичай клас є моделлю якоїсь сутності. Але абстрактний клас містить як реалізовані методи, а й реалізовані. Що це означає? Аналогом чого є абстрактний клас і чи має він аналоги в реальному світі?

Насправді є. Уяви майже закінчений кузов машини на конвеєрі. Туди можуть поставити як спортивний, так і економічний двигун. Як шкіряний салон, так і матер'яний. Конкретну реалізацію машини ще не визначено. Понад те, таких конкретних реалізацій з урахуванням цього кузова передбачається кілька. Але у такому вигляді машина нікому не потрібна. Це — класичний абстрактний клас: його об'єкти не мають сенсу, тому їх створення заборонено, клас має сенс, але тільки для його численних повноцінних спадкоємців, які будуть створені на його основі.

— Це не складно.

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

Давай подивимося приклад:

Код на Java Опис
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot (Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot (attacker);
  else
     applyMartialArts(attacker);
 }
}
У класі «охоронець» визначено, як чинити у разі нападу: стріляти чи застосувати бойові мистецтва.

Але не визначено, які саме бойові мистецтва, хоча точно відомо, що ця навичка є.

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

— Справді, за змістом дуже нагадує інтерфейс із кількома реалізованими методами.

— Так, абстрактні класи такого типу ми часто зустрічатимемо серед стандартних класів JavaSE.