Principes SOLID simplifiés (3/5): Substitution de Liskov

Principes SOLID simplifiés (3/5): Substitution de Liskov
Cliquez ici pour voir la table des matières

Introduction

Dans mon précédent article j’ai expliqué le deuxième principe SOLID (Ouvert-Fermé).

N’hésitez pas a découvrir les autres principes SOLID dans cette série d’articles:

Aujourd’hui je vous propose une explication pour le troisième principe S.O.L.I.D, c’est le principe «Substitution de Liskov» (Liskov Substitution), ce principe affirme que les classes dérivées doivent être substituables à leurs classes de base.

Je vous donne un mauvais exemple pour montrer la voilation du principe Substitution de Liskov:

Un mauvais exemple

public class Cat
{
    public virtual string GetName()
    {
        return nameof(Cat);
    }

    public void Move()
    {
        // Some implementation heren
    }

    public void Eat()
    {
        // Some implementation heren
    }
}
public class Dog : Cat
{
    public override string GetName()
    {
        return nameof(Dog);
    }
}
public static class Program
{
    public static void Main()
    {
        Cat cat = new Dog();
        cat.GetName();
    }
}

Le code est incorrect car l’exécution de la méthode “cat.GetName ()afficheraDog” et non “Cat” comme prévu

Un bon exemple

public abstract class Animal
{
    public abstract string GetName();
    public virtual void Move()
    {
        // Some implementation here
    }

    public void Eat()
    {
        // Some implementation here
    }
}
public sealed class Cat : Animal
{
    public override string GetName()
    {
        return nameof(Cat);
    }
}
public sealed class Dog : Animal
{
    public override string GetName()
    {
        return nameof(Dog);
    }

    public override void Move()
    {
        // Some implementation here
    }
}
public static class Program
{
    public static void Main()
    {
        var animals = new List<Animal>
        {
            new Cat(),
            new Dog()
        };

        foreach (var animal in animals)
        {
            animal.GetName();
            animal.Move();
            animal.Eat();
        }
    }
}

Le code est correct car les deux classes Cat et Dog peuvent être remplacées par la classe Animal sans avoir de comportements inattendus.

Si vous avez aimé cet article, n’hésitez pas à le partager !