Sobes.tech
Junior — Middle

Pode dar um exemplo que demonstre o princípio de substituição de Liskov na programação orientada a objetos?

sobes.tech IA

Resposta da IA

O Princípio da Substituição de Liskov (Liskov Substitution Principle, LSP) afirma que objetos de uma subclasse devem poder ser substituídos por objetos da superclasse sem violar a correção do programa.

Exemplo:

// Superclasse
class Bird {
    void fly() {
        System.out.println("O pássaro voa");
    }
}

// Subclasse que estende corretamente o comportamento
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("O pardal voa");
    }
}

// Violação do LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("A avestruz não consegue voar");
    }
}

// Uso
void makeBirdFly(Bird bird) {
    bird.fly(); // Espera-se que o pássaro possa voar
}

// Se passar Ostrich, o método fly() lançará uma exceção, violando o LSP.

Para cumprir o LSP, é melhor dividir a hierarquia:

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("O pardal voa"); }
}

class Ostrich extends Bird {
    // Não implementa Flyable, pois não consegue voar
}

Assim, objetos de subclasses podem ser usados sem comportamentos inesperados.