Sobes.tech
Junior — Middle

¿Puede dar un ejemplo que ilustre el principio de sustitución de Liskov en programación orientada a objetos?

sobes.tech AI

Respuesta de la IA

El Principio de Sustitución de Liskov (Liskov Substitution Principle, LSP) establece que los objetos de una subclase deben ser intercambiables con los objetos de la superclase sin violar la corrección del programa.

Ejemplo:

// Superclase
class Bird {
    void fly() {
        System.out.println("El pájaro vuela");
    }
}

// Subclase que extiende correctamente el comportamiento
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("El gorrión vuela");
    }
}

// Violación de LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("La avestruz no puede volar");
    }
}

// Uso
void makeBirdFly(Bird bird) {
    bird.fly(); // Se espera que el pájaro pueda volar
}

// Si se pasa Ostrich, el método fly() lanzará una excepción, violando LSP.

Para cumplir con LSP, es mejor dividir la jerarquía:

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("El gorrión vuela"); }
}

class Ostrich extends Bird {
    // No implementa Flyable, ya que no puede volar
}

De esta forma, los objetos de las subclases pueden usarse sin comportamientos inesperados.