Principes

L’abstraction en a différentes significations et domaine d’application selon les langages, mais en POO, on parle généralement des méthodes et classes abstraites.

En C++, il n’y a que la possibilité de rendre explicitement une méthode abstraite avec la syntaxe ‘virtual void toto () = 0’;

On dit que toto() est virtuelle pure, et on constate qu’elle n’a pas de code ⇒ elle représente une fonctionnalité / concept / … qui n’est pas définit

En Java, on utilise le mot-clé abstract pour déclarer explicitement des méthodes ET des classe abstraites.

Classe abstraite Java

Une classe abstraite ne peut pas etre instanciée

abstract class Humain {...}
Humain h = new Humain(); // Erreur Compil

<aside> ⚠️

On peut très bien avoir un constructeur, des attributs, des méthodes dans une classe abstraite. Mais, pour les manipuler, il faut forcément créer des sous-classes non abstraites. Ces sous-classes vont hériter des membres non privés

</aside>

Les raisons pour rendre une classe abstraite sont principalement :

Méthodes abstraites

Une méthode abstraite n’a pas de code, elle représente juste une fonctionnalité / concept / …

abstract class Humain {
	public abstract Humain rencontre(Humain h);
}

<aside> ⚠️

Une classe contenant une / plusieurs méthodes abstraites doit être déclarer abstraite et donc ne peut être instanciée.

</aside>

Rq: Il est relativement fréquent que la modélisation pousse à déclarer une méthode comme étant abstraite car on ne sait pas vraiment la définir. Mais, pour des besoins applicatifs on est amené à quand même définir ces méthodes avec un code vide (cf. exemple polymorphisme). Il peut également être intéressant de ne pas mettre une méthode abstraite quand on peut mettre dedans du code commun à la plupart des sous-classes.