====== Classes abtraites ====== ===== Concept ===== Une **classe abstraite** est une classe qui ne peut pas être instanciée directement, mais qui sert plutôt de **modèle** ou de **base** pour d'autres classes. Elle est conçue pour **être héritée** et **étendue** par d'autres classes qui peuvent en revanche être instanciées. Dans une classe abstraite, on pourra trouver : * Des **méthodes et attributs classiques**, comme on en a déjà l’habitude en POO ; * Des **méthodes dites « abstraites »** qui fournissent uniquement leur **signature**. Charge aux classes qui en héritent de définir le code de ces méthodes. Exemple : // une classe abstraite A public abstract class A { // une méthode non abstraite (=implémentée) dans A public void maMethode() { ... } // une méthode abstraite de A public abstract void autreMethode (int nombre) ; } // une classe qui dérive la classe abstraite A public class B extends A { // implémentation de la méthode abstraite de A : obligatoire, // sinon B reste abstraite public void autreMethode (int param) { ... } } // instanciation d'une classe qui dérive une classe abstraite : OK B b = new B (...) ; ===== Bénéfices ===== * On peut placer dans une **classe abstraite** toutes les **fonctionnalités** dont on souhaite disposer dans ses **classes dérivées**, sans pour autant définir leur **fonctionnement interne**; * On peut utiliser des **classes abstraites** pour simplement empêcher qu’une classe ne soit **instanciée** parce que son existence en tant que classe est **uniquement technique** et ne repose pas sur le besoin de manipuler l’objet en tant que tel. ===== Règles de construction ===== * Dès qu’une classe comporte une ou plusieurs méthodes abstraites, elle est abstraite, même si on ne l’indique pas avec le mot-clé « abstract » dans sa définition. * Une classe qui hérite d’une classe abstraite n’est pas tenue de redéfinir toutes les méthodes abstraites (elle peut n’en définir que certaines). Dans ce cas elle demeure elle-même abstraite. ===== Exemples d'utilisation ===== === Définir une classe abstraite === public abstract class Classe_A { ... } === Définir des méthodes abstraites === public class Classe_A { // Bien observer ici qu'il s'agit d'une signature de méthode : // + Pas de corps défini => pas de {} // + Un point-virgule en fin de ligne public abstract void uneMethode (liste_de_paramètres); ... } === Hériter de la classe abstraite (rien de nouveau ...) === public class Classe_B extends Classe_A { ... } === Implémenter les méthodes abstraites === public class UneClasse extends Classe_A { @Override public void uneMethode (liste_de_paramètres) { // Implémentation de la méthode ... qui n'est plus abstraite } }