Skip to content

Les classes abstraites

Une classe abstraite est une classe incomplète, c’est-à-dire qu’elle n’est pas instanciable. On doit nécessairement en redéfinir certaine(s) partie(s) pour pouvoir l’utiliser.

Une classe abstraite est une classe qui ne peut pas être instancié, il est donc impossible d’utiliser le mot clé new avec une classe abstraite.

Le but d’une classe abstraite est de permettre au programmeur de décider comment sera utiliser sa classe en déterminant quelles contraintes devront être respectées.

En Java, une classe peut être déclarée abstraite en utilisant le mot clé abstract.

Une classe abstraite doit impérativement être dérivée (étendue) en utilisant le mot clé extends afin de lui greffer les fonctionnalités nécessaires à son exécution.

Prenons l’exemple du super héros,

public abstract class SuperHero {
    private String nom;
    private String prenom;

    public SuperHero(String nom, String prenom) {
        this.nom = nom;
        this.prenom = prenom;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public abstract String attaquer();
}
La méthode attaquer() est ici déclaré abstraite pour signifier à l’utilisateur de la classe que la méthode n’est pas définie que qu’il devra la redéfinir lui-même.

Pour utiliser la classe SuperHero nous devons absolument l’étendre, autrement dit en hérité ET écrire la méthode.

Effectivement, un superhéro qui n’a pas de pouvoir ce n’est pas un superhéro!

Par exemple, nous pourrions écrire la méthode incomplète (abstraite) comme suit :

public class Batman extends SuperHero {
    public Batman(String nom, String prenom) {
        super(nom, prenom);
    }

    @Override
    public String attaquer() {
        return "Attaque à la chauve-souris";
    }
}

NOTE: La redéfinition de fonction n’est pas exactement la même chose dans le sens ou la redéfinition est fait de manière volontaire alors que dans le cas d’une classe abstraite la redéfinition doit absolument avoir lieu pour utiliser l’objet.

Portée

Les méthodes déclarées publiques dans une superclasse doivent également être publiques dans toutes les sous-classes. Les méthodes déclarées protégées dans une superclasse doivent être soit protégées, soit publiques dans les sousclasses ; elles ne peuvent pas être privées. Les méthodes déclarées privées ne sont pas du tout héritées, il n'y a donc pas de règle pour elles.

 

Représentation en UML d'une classe abstraite

Pour modéliser une classe abstraite en UML, il suffit de mettre le nom de la classe, ainsi que ses méthodes abstraites en italique.

SuperHero#nom : String#prenom : String+getNom(): String+getPrenom(): String+setNom(nom : String) : String+setPrenom(prenom : String) : String +SuperHero(nom : String, prenom : String) : SuperHero +attaquer() : voidBatman+Batman(nom : String, prenom : String) : Batman+attaquer() : voidLa méthode attaquer()est en italique!
SuperHero#nom : String#prenom : String+getNom(): String+getPrenom(): String+setNom(nom : String) : String+setPrenom(prenom : String) : String +SuperHero(nom : String, prenom : String) : SuperHero +attaquer() : voidBatman+Batman(nom : String, prenom : String) : Batman+attaquer() : voidLa méthode attaquer()est en italique!