↑
CHAPITRE 7.1

Classes abstraites

CrĂ©er des classes qui ne peuvent pas ĂȘtre instanciĂ©es
Une classe abstraite est une classe qui ne peut pas ĂȘtre instanciĂ©e directement. Elle sert de modĂšle pour d'autres classes qui l'hĂ©ritent. Les mĂ©thodes abstraites doivent ĂȘtre implĂ©mentĂ©es par les classes filles.

7.1Classes abstraites

7.1.1 – MĂ©thodes abstraites

Une mĂ©thode abstraite est une mĂ©thode dĂ©clarĂ©e sans implĂ©mentation (sans corps). Elle est marquĂ©e avec le mot-clĂ© abstract et se termine par un point-virgule au lieu d'un bloc de code. Les mĂ©thodes abstraites doivent ĂȘtre implĂ©mentĂ©es par toutes les classes filles non abstraites.

🔑 CaractĂ©ristiques des mĂ©thodes abstraites

  • DĂ©clarĂ©e avec le mot-clĂ© abstract
  • N'a pas de corps (pas d'implĂ©mentation)
  • Se termine par un point-virgule
  • Doit ĂȘtre implĂ©mentĂ©e par les classes filles non abstraites
  • Ne peut exister que dans une classe abstraite

Exemple : Classe abstraite avec méthode abstraite

public abstract class Forme {
    protected String couleur;
    
    // Méthode abstraite : pas d'implémentation
    public abstract double calculerAire();
    
    // Méthode abstraite avec paramÚtres
    public abstract double calculerPerimetre();
    
    // MĂ©thode concrĂšte (non abstraite) : peut ĂȘtre utilisĂ©e telle quelle
    public void afficher() {
        System.out.println("Forme de couleur " + couleur);
        System.out.println("Aire : " + calculerAire());  // Appelle la méthode abstraite
    }
    
    // Une classe abstraite peut avoir des méthodes concrÚtes
    public void setCouleur(String couleur) {
        this.couleur = couleur;
    }
}

⚠ RĂšgles importantes

RÚgles pour les méthodes abstraites :
  • Une mĂ©thode abstraite ne peut exister que dans une classe abstraite
  • Une classe avec au moins une mĂ©thode abstraite doit ĂȘtre dĂ©clarĂ©e abstract
  • Les classes filles non abstraites doivent implĂ©menter toutes les mĂ©thodes abstraites
  • Une mĂ©thode abstraite ne peut pas ĂȘtre private ou final
  • Une mĂ©thode abstraite ne peut pas ĂȘtre static

💡 Pourquoi utiliser des mĂ©thodes abstraites ?

Les méthodes abstraites permettent de :

  • DĂ©finir un contrat : Forcer les classes filles Ă  implĂ©menter certaines mĂ©thodes
  • Polymorphisme : Utiliser diffĂ©rentes implĂ©mentations de maniĂšre uniforme
  • Structure : Organiser le code en dĂ©finissant ce qui doit ĂȘtre fait sans spĂ©cifier comment

7.1.2 – Utilisation

Pour utiliser une classe abstraite, vous devez créer une classe fille qui hérite de la classe abstraite et implémente toutes les méthodes abstraites.

📝 ImplĂ©mentation des mĂ©thodes abstraites

Les classes filles doivent fournir une implémentation pour toutes les méthodes abstraites de la classe mÚre.

Exemple : Implémentation complÚte

public abstract class Forme {
    protected String couleur;
    
    public abstract double calculerAire();
    public abstract double calculerPerimetre();
    
    public void setCouleur(String couleur) {
        this.couleur = couleur;
    }
}

// Classe Cercle : implémente toutes les méthodes abstraites
public class Cercle extends Forme {
    private double rayon;
    
    public Cercle(double rayon) {
        this.rayon = rayon;
    }
    
    @Override
    public double calculerAire() {
        return Math.PI * rayon * rayon;
    }
    
    @Override
    public double calculerPerimetre() {
        return 2 * Math.PI * rayon;
    }
}

// Classe Rectangle : implémente toutes les méthodes abstraites
public class Rectangle extends Forme {
    private double largeur;
    private double hauteur;
    
    public Rectangle(double largeur, double hauteur) {
        this.largeur = largeur;
        this.hauteur = hauteur;
    }
    
    @Override
    public double calculerAire() {
        return largeur * hauteur;
    }
    
    @Override
    public double calculerPerimetre() {
        return 2 * (largeur + hauteur);
    }
}

đŸš« Instanciation impossible

Une classe abstraite ne peut pas ĂȘtre instanciĂ©e directement. Vous devez crĂ©er une classe fille concrĂšte.

Exemple : Erreur d'instanciation

// ❌ ERREUR : Impossible d'instancier une classe abstraite
// Forme f = new Forme();

// ✅ CORRECT : Instancier une classe fille concrùte
Forme cercle = new Cercle(5.0);
Forme rectangle = new Rectangle(4.0, 6.0);

// Utilisation polymorphique
cercle.setCouleur("Rouge");
System.out.println("Aire du cercle : " + cercle.calculerAire());

rectangle.setCouleur("Bleu");
System.out.println("Aire du rectangle : " + rectangle.calculerAire());

🔄 Utilisation polymorphique

Les classes abstraites permettent l'utilisation du polymorphisme, comme avec les classes normales.

Exemple : Polymorphisme avec classes abstraites

public class TestFormes {
    public static void main(String[] args) {
        // Tableau polymorphique
        Forme[] formes = {
            new Cercle(5.0),
            new Rectangle(4.0, 6.0),
            new Cercle(3.0)
        };
        
        // Traiter toutes les formes de maniĂšre uniforme
        for (Forme forme : formes) {
            System.out.println("Aire : " + forme.calculerAire());
            System.out.println("PérimÚtre : " + forme.calculerPerimetre());
            System.out.println("---");
        }
    }
}

📊 Exemple complet : SystĂšme de vĂ©hicules

Exemple : Hiérarchie de véhicules

public abstract class Vehicule {
    protected String marque;
    protected int annee;
    
    public Vehicule(String marque, int annee) {
        this.marque = marque;
        this.annee = annee;
    }
    
    // Méthode abstraite : chaque véhicule doit avoir une façon de démarrer
    public abstract void demarrer();
    
    // MĂ©thode abstraite : chaque vĂ©hicule doit avoir une façon de s'arrĂȘter
    public abstract void arreter();
    
    // Méthode concrÚte : commune à tous les véhicules
    public void afficherInfo() {
        System.out.println("Marque : " + marque + ", Année : " + annee);
    }
}

public class Voiture extends Vehicule {
    public Voiture(String marque, int annee) {
        super(marque, annee);
    }
    
    @Override
    public void demarrer() {
        System.out.println("La voiture démarre avec une clé");
    }
    
    @Override
    public void arreter() {
        System.out.println("La voiture s'arrĂȘte");
    }
}

public class Moto extends Vehicule {
    public Moto(String marque, int annee) {
        super(marque, annee);
    }
    
    @Override
    public void demarrer() {
        System.out.println("La moto démarre avec un bouton");
    }
    
    @Override
    public void arreter() {
        System.out.println("La moto s'arrĂȘte");
    }
}

💡 Points clĂ©s Ă  retenir

  • Classe abstraite : Ne peut pas ĂȘtre instanciĂ©e, peut contenir des mĂ©thodes abstraites et concrĂštes
  • MĂ©thode abstraite : DĂ©clarĂ©e sans implĂ©mentation, doit ĂȘtre implĂ©mentĂ©e par les classes filles
  • ImplĂ©mentation obligatoire : Les classes filles non abstraites doivent implĂ©menter toutes les mĂ©thodes abstraites
  • Polymorphisme : Les classes abstraites permettent l'utilisation du polymorphisme
  • Mot-clĂ© abstract : UtilisĂ© pour dĂ©clarer une classe ou une mĂ©thode abstraite
Conseils pratiques :
  • Utilisez des classes abstraites quand vous avez un code commun Ă  partager entre plusieurs classes
  • Les mĂ©thodes abstraites dĂ©finissent un contrat que les classes filles doivent respecter
  • Une classe abstraite peut avoir des mĂ©thodes concrĂštes (non abstraites) pour partager du code
  • Les classes abstraites sont utiles pour crĂ©er des hiĂ©rarchies de classes avec des comportements partiels