"Ciao, Amigo! Ieri sei stato istruito sui modi delle lezioni astratte. Ora è il momento di approfondire la nostra conoscenza. Voglio insegnarti come usare correttamente le lezioni astratte."

È difficile trovare un'analogia nel mondo reale per una classe astratta. Una classe è solitamente un modello di qualche entità. Ma una classe astratta contiene metodi che non sono stati implementati e può contenere metodi che sono stati implementati. Che cosa significa? Quale analogia per una classe astratta possiamo trovare? Esiste una cosa del genere nel mondo reale?

In realtà, c'è. Immagina il telaio di un'auto quasi finita su un nastro trasportatore. Posso installare un motore truccato o un motore altamente efficiente. Interni in pelle o rivestimenti in tessuto. L'implementazione specifica dell'auto non è ancora stata determinata. Inoltre, lo chassis potrebbe essere utilizzato per produrre diverse implementazioni specifiche. Ma nessuno vuole l'auto nella sua forma attuale. Questa è una classica classe astratta : crearne istanze non avrebbe senso, quindi non puoi crearle; la classe ha senso solo a causa dei numerosi eredi a tutti gli effetti che verranno creati sulla sua base.

"È abbastanza facile."

Ma ci possono essere analogie ancora più astratte. Più come interfacce con alcuni metodi implementati. Ad esempio, considera un interprete professionista . Senza specificare la lingua di partenza e di destinazione, abbiamo un « traduttore astratto ». Oppure considera una guardia del corpo. Potremmo sapere che padroneggia le arti marziali e può proteggere il suo cliente. Ma quali arti marziali e come proteggerà il cliente sono "dettagli implementativi" di ogni specifica guardia del corpo.

Diamo un'occhiata a un esempio:

codice java Descrizione
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);
 }
}
La classe BodyGuard determina come affrontare un attacco: sparare o usare arti marziali.

Tuttavia, l'arte marziale specifica non è specificata, sebbene siamo certi che l'abilità esista.

Possiamo creare diverse guardie del corpo (ereditando questa classe). Tutti loro saranno in grado di proteggere il cliente e sparare all'attaccante.

"Hai ragione. È molto simile a un'interfaccia con alcuni metodi implementati."

"Sì, questo tipo di classe astratta è comune tra le classi Java SE standard."