« Bonjour, Amigo ! Hier, on t'a enseigné les voies des classes abstraites. Maintenant, il est temps d'approfondir nos connaissances. Je voudrais t'apprendre à utiliser correctement les classes abstraites. »

Il est difficile de trouver une analogie dans le monde réel pour une classe abstraite. Une classe est généralement un modèle d'une entité. Mais une classe abstraite contient des méthodes qui ne sont pas implémentées, et peut contenir des méthodes qui ont été implémentées. Qu'est-ce que cela veut dire ? Peut-on trouver une analogie pour une classe abstraite ? Est-ce qu'une chose semblable existe dans le monde réel ?

Eh bien oui. Imagine le châssis d'une voiture presque terminée sur une chaîne de montage. Je peux installer soit un moteur surchargé soit un moteur très efficace. Un intérieur soit en cuir soit en tissu. L'implémentation spécifique de la voiture n'a pas encore été déterminée. De plus, le châssis pourrait être utilisé pour produire plusieurs implémentations spécifiques. Mais personne ne veut de la voiture dans sa forme actuelle. C'est une classe abstraite classique : la création d'instances de ce type ne serait pas logique, et tu ne peux donc pas les créer. La classe n'a de sens qu'en raison des nombreux héritiers spécifiques qui seront créés sur sa base.

« Ça me semble assez simple. »

Mais il peut y avoir des analogies encore plus abstraites. Plutôt comme des interfaces avec quelques méthodes implémentées. Par exemple, considérons un interprète professionnel. Si nous ne spécifions pas de langues source et cible, nous avons un 'interprète abstrait'. Ou considérons un garde du corps. Nous savons qu'il maîtrise les arts martiaux et peut protéger son client. Mais les arts martiaux qu'il maîtrise et la façon dont il protège son client sont « les détails de l'implémentation » de chaque garde du corps spécifique.

Prenons un exemple :

Code Java Description
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 détermine comment faire face à une attaque : tirer ou utiliser les arts martiaux.

Cependant, l'art martial spécifique n'est pas précisé, même si nous sommes certains que cette compétence existe.

Nous pouvons créer plusieurs gardes du corps différents (en héritant de cette classe). Chacun d'entre eux sera en mesure de protéger le client et de tirer sur l'assaillant.

« Tu as raison. Ça ressemble beaucoup à une interface avec quelques méthodes implémentées. »

« Oui, ce type de classe abstraite est courant parmi les classes standard de Java SE. »