Na wikipedii piszą:
jeśli będziemy tworzyć egzemplarz klasy potomnej, to niezależnie od tego, co znajdzie się we wskaźniku na zmienną, wywoływanie metody, którą pierwotnie zdefiniowano w klasie bazowej, powinno dać te same rezultaty.
Na helionie też coś podobnego piszą:
https://helion.pl/blog/mnemonik-solid-l-jak-liskov-substitution-principle-55
- Mamy klasę A z metodą MyMethod, która zwraca wartość Z.
- Tworzymy klasę B, która dziedziczy z A.
- Niezależnie od sposobu utworzenia klasy A oraz B:
- A a = new A()
- A b1 = new B()
- B b2 = new B()
Musi zajść równość: a.MyMethod() == b1.MyMethod() == b2.MyMethod()
W innym przypadku dochodzi do pogwałcenia zasady Liskov Substition Principle.
Ja stworzyłem takie klasy
class Employee
{
public virtual float GetAverageSalary()
{
return 3000;
}
}
class Programmer : Employee
{
public override float GetAverageSalary()
{
return 8000;
}
public List<string> GetKnownProgrammingLanguages()
{
return new List<string> { "C#", "Java", "Python" };
}
}
Employee employee = new Employee();
var averageEmployeeSalary = employee.GetAverageSalary(); // 3000
Programmer programmer = new Programmer();
var averageProgrammerSalary = programmer.GetAverageSalary(); // 8000
To to jest niby złamanie zasady Liskov????? Bo przecież metoda GetAverageSalary() zwróci inny wynik dla klasy pracownika i programisty. To chyba przesada, że ja tu łamię zasadę Liskov??