"Здравей, Амиго! Вчера те обучаваха по начините на абстрактните класове. Сега е време да задълбочим знанията си. Искам да те науча How да използваш правилно абстрактните класове."

Трудно е да се измисли аналогия от реалния свят за абстрактен клас. Класът обикновено е модел на няHowъв обект. Но абстрактен клас съдържа методи, които не са имплементирани, и може да съдържа методи, които са имплементирани. Какво означава това? Каква аналогия за абстрактен клас можем да намерим? Има ли такова нещо в реалния свят?

Всъщност има. Представете си шасито на почти завършена кола на конвейер. Мога да инсталирам or усъвършенстван двигател, or високоефективен двигател. Или кожен салон, or тапицерия от плат. Конкретното изпълнение на автомобила все още не е определено. Нещо повече, шасито може да се използва за производството на няколко специфични изпълнения. Но никой не иска колата в сегашния й вид. Това е класически абстрактен клас : създаването на негови екземпляри няма да има смисъл, така че не можете да ги създадете; класът има смисъл само заради множеството пълноправни наследници, които ще се създадат на негова основа.

— Това е достатъчно лесно.

Но може да има и още по-абстрактни аналогии. По-скоро като интерфейси с няколко внедрени метода. Например, помислете за професионален преводач . Без да посочваме изходния и целевия език, имаме « абстрактен преводач ». Или помислете за бодигард. Може да знаем, че той владее бойни изкуства и може да защити клиента си. Но кои бойни изкуства и How ще защити клиента са "детайли за изпълнение" на всеки конкретен бодигард.

Да разгледаме един пример:

Java code Описание
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);
 }
}
Класът BodyGuard определя How да се справите с атака: стреляйте or използвайте бойни изкуства.

Конкретното бойно изкуство обаче не е посочено, но сме сигурни, че умението съществува.

Можем да създадем няколко различни бодигарда (като наследим този клас). Всички те ще могат да защитят клиента и да застрелят нападателя.

„Прав си. Много прorча на интерфейс с няколко внедрени метода.“

„Да, този тип абстрактен клас е често срещан сред стандартните Java SE класове.“