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.
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 :
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>
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();
}