Aller au contenu

L'héritage

Classes parents et enfants

L'héritage de classe permet d'obtenir des classes plus spécialisées, tout en gardant les propriétés et les méthodes de la classe parent.

classDiagram
    Animal <|-- Chien
    Animal <|-- Chat

    class Animal {
        String nom
        String espece

        Animal(nom, espece)
        marcher()
    }

    class Chien {
        String surnom
        bool estPurRace
        Chien(nom, purRace)
        jappe()
    }
    class Chat {
        int viesRestantes
        Chat(nom)
        miaule()
    }

Ainsi, tous les animaux doivent avoir un nom et une espèce (seul constructeur disponible) et peuvent marcher. Pour instancier un chat, pas besoin d'avoir l'espèce, mais un nom est important. Il possède aussi un nombre de vies restantes, ce que les animaux n'ont pas. Le principe est similaire pour les chiens.

Polymorphisme

Le polymorphisme consiste à utiliser des méthodes communes à une classe de base (ou à une interface). Imaginons les animaux suivants, dans chacun leur liste, et que nous voulions les faire marcher :

// Une liste de chiens
ArrayList<Chien> listeChiens = new ArrayList<>();
listeChiens.add(new Chien("Fido", true));
listeChiens.add(new Chien("Toto", false));

// Une liste de chats, syntaxe différente
ArrayList<Chat> listeChats = new ArrayList<>() {
    {
        add(new Chat("Minet"));
        add(new Chat("Muffin"));
    }
};

// Faire marcher les chiens et les chats
for (Chien chien : listeChiens) {
    chien.marche();
}
for (Chat chat : listeChats) {
    chat.marche();
}

On voit rapidement que ce n'est pas l'idéal. À la place, étant donné que les chiens et les chats sont des sous-classes de Animal, il serait possible d'utiliser cette classe principale pour faire marcher tous les animaux :

ArrayList<Animal> listeAnimaux = new ArrayList<>() {
    {
        add(new Chien("Fido", true));
        add(new Chien("Toto", false));
        add(new Chat("Minet"));
        add(new Chat("Muffin"));
    }
};
for (Animal animal : listeAnimaux) {
    animal.marche();
}

On pourrait également faire japper seulement les chiens contenus dans la liste en vérifiant si la variable est une instance de chien :

for (Animal animal : listeAnimaux) {
    animal.marche();

    if (animal instanceof Chien) {
        Chien chien = (Chien) animal;
        chien.jappe();
    }
}