Sobes.tech
Junior — Middle

Pouvez-vous donner un exemple illustrant le principe de substitution de Liskov en programmation orientée objet?

sobes.tech IA

Réponse de l'IA

Le principe de substitution de Liskov (Liskov Substitution Principle, LSP) stipule que les objets d'une sous-classe doivent pouvoir être utilisés à la place des objets de la super-classe sans violer la correction du programme.

Exemple :

// Super-classe
class Bird {
    void fly() {
        System.out.println("L'oiseau vole");
    }
}

// Sous-classe qui étend correctement le comportement
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("Le moineau vole");
    }
}

// Violation du LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("L'autruche ne peut pas voler");
    }
}

// Utilisation
void makeBirdFly(Bird bird) {
    bird.fly(); // On s'attend à ce que l'oiseau puisse voler
}

// Si on passe Ostrich, la méthode fly() lancera une exception, violant le LSP.

Pour respecter le LSP, il est préférable de diviser la hiérarchie :

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("Le moineau vole"); }
}

class Ostrich extends Bird {
    // Ne met pas en œuvre Flyable, car il ne peut pas voler
}

Ainsi, les objets des sous-classes peuvent être utilisés sans comportement inattendu.