SOLID: Sustitución de Liskov

Actualizado: ene 12

Ya estamos de vuelta de las vacaciones, y con ello seguimos con nuestros tutoriales, esta vez con la 'L' de SOLID, el principio de sustitución de Liskov.


Este principio lo que nos viene a decir, es que una clase hija puede ser usada como si fuera una clase padre. Y fue introducido por una mujer llamada Barbara Liskov.


En la programación orientada a objetos podemos crear clases que hereden comportamientos de otras clases, muchas veces, al hacer esto traemos métodos que no utilizamos y los sobrescribimos dejándolos vacíos, pero esto es un error.


Pongamos un ejemplo del problema.


Supongamos que tenemos dos clases Rectangulo y Cuadrado, y que la segunda hereda de la primera.



public class Rectangulo {
    int base;
    int height;
    
    calculateArea() {
        return base * height;
    }
}

public class Cuadrado extends Rectangulo {
    ...
}

Hasta aquí todo bien, pero ahora vamos a usar la clase Cuadrado.



public class App {
    void checkArea(Rectangulo rectangulo) {
        rectangulo.setBase(4);
        rectangulo.setHeight(5);
        
        rectangulo.calculateArea(); // Error si es un Cuadrado
}

El método calculateArea() funcionaría de manera incorrecta, porque si la clase dinámica de Rectangulo fuera Cuadrado, el area debe ser 25 y no 20.


Ahora vamos a ver un ejemplo de una buena implementación:

public interface Vehicle{
 void run();
}
 
public class Truck implements Vehicle {
 void run() {
     moreCombustible();
 }
}
 
public class ElectricCar implements Vehicle{
 void run(){
     incrementElectricPower();
 }
}
 
public class Conductor{
    function drive(InterfazVehiculo vehiculo){
       ...
       v.run();
    }
}

El conductor tiene un objeto Vehicle cuya instancia pertenece a una de sus clases hijas. Pero no necesita saber a cuál en concreto para hacerlo funcionar.


Espero que te haya gustado, recuerda que puedes seguirme en Twitter y ver otros artículos en la web y blog.


Hasta la próxima :)

76 vistas0 comentarios

©2020 por Juanma Perez.