Sobes.tech
Junior — Middle

Puoi fornire un esempio che illustra il principio di sostituzione di Liskov nella programmazione orientata agli oggetti?

sobes.tech AI

Risposta dell'AI

Il Principio di Sostituzione di Liskov (Liskov Substitution Principle, LSP) afferma che gli oggetti di una sottoclasse devono poter essere sostituiti agli oggetti della superclasse senza violare la correttezza del programma.

Esempio:

// Superclasse
class Bird {
    void fly() {
        System.out.println("Uccello vola");
    }
}

// Sottoclasse che estende correttamente il comportamento
class Sparrow extends Bird {
    @Override
    void fly() {
        System.out.println("Passero vola");
    }
}

// Violazione di LSP
class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("Struzzo non può volare");
    }
}

// Uso
void makeBirdFly(Bird bird) {
    bird.fly(); // Si aspetta che l'uccello possa volare
}

// Se si passa Ostrich, il metodo fly() lancerà un'eccezione, violando LSP.

Per rispettare LSP, è meglio dividere la gerarchia:

interface Flyable {
    void fly();
}

class Bird {}

class Sparrow extends Bird implements Flyable {
    public void fly() { System.out.println("Passero vola"); }
}

class Ostrich extends Bird {
    // Non implementa Flyable, poiché non può volare
}

In questo modo, gli oggetti delle sottoclassi possono essere usati senza comportamenti inaspettati.