Mateusz Wajnberger
Liskov Substitution Principle
Zasada według której w miejscu, gdzie wykorzystywana jest klasa bazowa, bez problemu można użyć klas pochodnych, które mogą rozszerzać bazowe funkcjonalności, ale zmiany w nich zawarte nie mogą mieć wpływu na działanie programu oraz jego wynik.
Przykład
Mamy do dyspozycji klasę bazową „Animal”, po której dziedziczą klasy „Dog” oraz „Fish”. Jakakolwiek funkcja przyjmująca w parametrze typ Animal, powinna obsłużyć także instancję Dog oraz Fish. W naszym przykładzie występuje przypadek nie do końca przemyślanego dziedziczenia. Ryba co prawda jest zwierzęciem, jednak nie potrafi biegać.
public abstract class Animal {
public String name;
public abstract void Run();
}
public class Dog extends Animal{
@Override
public void Run() {
System.out.println("Dog is running");
}
}
public class Fish extends Animal{
@Override
public void Run() {
throw new UnsupportedOperationException("Fish can not run!");
}
}
Zastosowanie Liskov Substitution Principle
Pokazując prawidłowe zastosowanie omawianej zasady, jako przykład weźmiemy ekspres do kawy. Klasa „CoffeeLatteMachine” dziedziczy po klasie „CoffeeMachine” metodę „prepare” przy pomocy słowa „super”. Obiekt klasy pochodnej można użyć w miejscu klasy bazowej. Dodatkowo nie nadpisujemy metod klasy bazowej, tylko z nich korzystamy.
public class CoffeeMachine {
public void prepare() {
System.out.println("Pour coffee to the cup");
System.out.println("Pour water to the cup");
}
}
public class CoffeeLatteMachine extends CoffeeMachine{
@Override
public void prepare() {
super.prepare();
System.out.println("Pour milk to the cup");
}
}
public class Main {
public static void main(String[] args) {
CoffeeMachine coffee;
System.out.println("Making normal coffee");
coffee = new CoffeeMachine();
coffee.prepare();
System.out.println("Making latte coffee");
coffee = new CoffeeLatteMachine();
coffee.prepare();
}
}