Liskov Substitution Principle - 3 zasada SOLID

Zasada podstawienia Liskov.


Zasada podstawienia Liskov mówi, że "Funkcje, które używają wskaźników lub referencji do klas bazowych, muszą być w stanie używać również obiektów klas dziedziczących po klasach bazowych, bez dokładnej znajomości tych obiektów". Autorem tej zasady jest Barbara Liskov. W skrócie mówiąc klasa dziedzicząca po klasie bazowej nie powinna zmieniać jej funkcjonalności tylko rozszerzać możliwości. Najpopularniejszym przykładem na złamanie tej zasady jest dziedziczenie klasą kwadrat po klasie prostokąt.

Kod klasy kwadrat i prostokąt:

public class Prostokat
{
    public virtual int Szerokosc { get; set; }
    public virtual int Wysokosc { get; set; }
}
 
public class Kwadrat : Prostokat
{
    public override int Wysokosc
    {
        get { return base.Wysokosc; }
        set { UstawBoki(value); }
    }
 
    public override int Szerokosc
    {
        get { return base.Szerokosc; }
        set { UstawBoki(value); }
    }
 
    // równe boki dla kwadratu
    private void UstawBoki(int value)
    {
        base.Wysokosc = value;
        base.Szerokosc = value;
    }
}
Dla kwadratu wywołujemy metodę UstawBoki(), która ustawia obydwa boki na tę samą długość.

Kod głównej klasy programu:

public class Program
{
    public static void Main()
    {   
        //dla kwadratu wypisze 10x10
        Prostokat kwadrat = new Kwadrat();
        kwadrat.Szerokosc = 4;
        kwadrat.Wysokosc = 10;
 
        Console.WriteLine("{0} x {1}",
                            kwadrat.Szerokosc,
                            kwadrat.Wysokosc);
 
 
        //dla prostokata wypisze 4x10
        Prostokat prostokat = new Prostokat();
        prostokat.Szerokosc = 4;
        prostokat.Wysokosc = 10;
 
        Console.WriteLine("{0} x {1}",
                            prostokat.Szerokosc,
                            prostokat.Wysokosc);
 
        Console.ReadLine();
    }  
}
Program w zależności od typu stworzonego obiektu zwraca inne wyniki pomimo ustawienia w ten sam sposób długości boków. Jest to przykład zmiany zachowania klasy bazowej. Klasa Kwadrat dziedziczy po klasie Prostokat, a pomimo to w zależności od tego, do której klasy posiadamy referencje otrzymujemy inny wynik, chociaż typ obiektu jest cały czas taki sam a więc Prostokat.
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):