Keyboard shortcuts

Touchez ← ou → pour naviguer les chapitres

Touchez S ou / pour chercher dans le livre

Touchez ? pour afficher ce message

Touchez Esc pour masquer ce message

Accueil > Programmation orientée objet >

📚 Interfaces et classes abstraites

Survol et attentes

L’hĂ©ritage via un lien de parentĂ© est bon pour des objets similaires qui accomplissent une tĂąche semblable. Mais que faire si l’objet parent ne sera jamais utilisĂ© pour dĂ©clarer un objet? Ou si on veut un nouvel type d’objet qui n’utilise qu’une partie de la fonctionnalitĂ© d’une autre classe ou qui veut combiner la fonctionnalitĂ© de plusieurs classes?

Les réponses sont les classes abstraites et les interfaces.

Définitions

Une classe abstraite ne peut jamais ĂȘtre instanciĂ©e. Elle sert de modĂšle pour d’autres classes qui hĂ©ritent de ses attributs et mĂ©thodes. Une classe abstraite peut contenir des mĂ©thodes abstraites, qui sont des mĂ©thodes qui n’ont pas de corps. Les classes qui hĂ©ritent d’une classe abstraite doivent implĂ©menter les mĂ©thodes abstraites. Une classe qui extends une classe abstraite respecte toujours la relation “est un” avec la classe abstraite, pareil que pour l’hĂ©ritage normal.

Une interface est un type de classe qui ne contient que des mĂ©thodes abstraites (et parfois des constantes privĂ©es). Une classe peut implĂ©menter plusieurs interfaces, mais ne peut hĂ©riter que d’une seule classe abstraite.

La vidĂ©o suivante explique bien le portrait : đŸ“ș Classes et mĂ©thodes abstraites

Classes abstraites

La classe Animal est un bon candidat pour une classe abstraite parce qu’aucun animal n’est juste un animal. Il y a des chiens, des chats, des oiseaux, etc. Pour dĂ©clarer que la classe Animal est abstraite, on utilise le mot-clĂ© abstract :

public abstract class Animal { // abstract ici prévient l'instanciation de la classe
    protected String name;
    //...

    abstract void family(); // ; au lieu de {}
        // abstract ici force les classes enfants à implémenter cette méthode
    //...
}

Une classe enfant, p. ex. Dog, doit implémenter toutes les méthodes abstraites de la classe parente :

public class Dog extends Animal {
    //...
    @Override
    void family() {
        System.out.println("Canine");
    }
    //...
}

Souvent, les outils de votre EDI vous signalent une erreur en dĂ©clarant l’hĂ©ritage d’une classe abstraite et vous proposent d’implĂ©menter les mĂ©thodes abstraites. Dans VS Code, ce serait une suggestion parmis les “Quick Fix (Ctrl+.)”.

Voici le diagramme de classe UML simplifiĂ© (ne montrant pas le contenu des classes) pour la relation entre le parent abstrait Animal et l’enfant Dog :

abstract

Notez que c’est le mĂȘme type de flĂšche parce que la relation est toujours de l’hĂ©ritage, soit Dog est un Animal. La diffĂ©rence est l’apparence de la classe parente, qui est en italique pour indiquer qu’elle est abstraite.

Interfaces

Pour les interfaces, on remplace le mot-clé class par interface :

public interface Eating {
    void eat(); // méthode abstraite par défaut : pas besoin du mot-clé abstract
}
public interface Moving {
    void move();
}

Une classe peut implĂ©menter plusieurs interfaces. Pour indiquer que la classe implĂ©mente une interface, on utilise le mot-clĂ© implements. S’il y a plusieurs interfaces, on les sĂ©pare par des virgules :

public class Dog extends Animal implements Eating, Moving {
    //...
    @Override
    void family() {
        System.out.println("Canine");
    }
    @Override
    void eat() {
        System.out.println("I eat kibble!");
    }
    @Override
    void move() {
        System.out.println("Running and rolling and wagging!");
    }
    //...
}

Les interfaces peuvent ĂȘtre utilisĂ©es dans une variĂ©tĂ© de classes peut importe leur lien de parentĂ© :

public class Car implements Moving {
    //...
    @Override
    void move() {
        System.out.println("Driving!");
    }
    //...
}

L’implĂ©mentation d’une interface signale une relation “a un” entre la classe et l’interface. La classe Car a une mĂ©thode move() qui est dĂ©finie dans l’interface Moving, mais on ne dirait pas que Car est un Moving parce qu’il peut ĂȘtre d’autres choses aussi, notamment une autre classe parente (p. ex. Vehicle).

Voici le diagramme de classe UML simplifiĂ© pour les relations d’implĂ©mentation dans ces exemples.

interface

Notez que la flĂšche est diffĂ©rente pour l’implĂ©mentation : la tĂȘte est pleine mais la ligne est pointillĂ©e.

Le but des interfaces et de fournir une interface de programmation (API) pour toutes les classes qui implĂ©mentent une fonctionnalitĂ© commune. Par exemple, dans la bibliothĂšque standard de Java toutes les collections - comme les listes, les ensembles et les dictionnaires - implĂ©mentent l’interface Collection qui dĂ©finit les mĂ©thodes add(), remove(), contains(), etc. Ainsi toutes les classes peuvent implĂ©menter Ă  leur façon ces mĂ©thodes, mais les utilisateurs de ces classes accĂšdent Ă  la fonctionnalitĂ© avec les mĂȘmes appels de mĂ©thodes. Cela rend les grands projets plus prĂ©visibles, extensibles et faciles Ă  utiliser.

Objectifs d’apprentissage

À la fin de cette leçon vous devrez ĂȘtre en mesure de :

  • Comprendre et expliquer les structures abstraites : les classes abstraites, les mĂ©thodes abstraites et les interfaces et leurs mot-clĂ©s respectifs
  • Savoir dans quels contextes il est prĂ©fĂ©rable d’étendre une classe (l’enfant “est un”?) au lieu d’implĂ©menter une interface (l’enfant “as un”?)
  • Distinguer les relations “est un” et “as un” dans un diagramme de classe UML.

CritĂšres de succĂšs

  • Je peux identifier quand une classe abstraite ou une interface est plus appropriĂ©e que l’hĂ©ritage simple.
  • Je peux dĂ©clarer une classe abstraite et une interface et implĂ©menter leurs mĂ©thodes abstraites dans une classe enfant.

Exercices

Quiz de consolidation

Travail pratique:

  1. Pour une catĂ©gorie d’objets nommĂ©e GuiWindow (pour les fenĂȘtres qui s’ouvrent sur un ordinateur), pensez Ă  une courte liste (soit une liste partielle) d’interfaces qui pourraient ĂȘtre implĂ©mentĂ©es par les classes de cette catĂ©gorie. IdĂ©es : on peut fermer, redimensionner, rĂ©duire, etc. les fenĂȘtres. Pour la classe GuiWindow et les interfaces indentifiĂ©es, crĂ©ez les dĂ©clarations de base dans des fichiers Java. L’utilitĂ© de chaque interface devrait ĂȘtre Ă©vidente par son nom et par le nom de sa ou ses mĂ©thodes abstraites.
  2. Créez le diagramme de classe UML simplifié (sans contenu interne) pour montrer les relations entre les classes et les interfaces que vous avez déclarées dans la question précédente.

© 2022-2025 David Crowley