1. Principes

L’abstraction à 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() et virtuelle pure, et on constate qu’elle n’a pas de code. ⇒ elle représente une fonctionnalité / concept / … qui n’est pas défini.

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

2. Classe abstraite Java

Une classe abstraite ne peut pas être 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.

</aside>

Les raisons pour rendre une classe abstraite sont principalement :

3. 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 au moins une méthode abstraite doit-être déclarée abstraite et donc ne peut être instanciée.

</aside>

Pour autant, 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. 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.

<aside> ⚠️

Dans une hiérarchie de classe où sont présentes des classes et méthodes abstraites, il est obligatoire de définir toutes ces méthodes pour les classes instanciables.

</aside>

4. Cas bizarre

Parfois, l’abstract apparait et disparait dans une même hiérarchie

abstract class A{
	abstract void toto();
}
class B extends A{
	public void toto(){...}
}
abstract class C extends B{
	public abstract void print();
}