# Il principio LSP (Liskov Substitution Principle)

Questo principio afferma che:

> I tipi utilizzati all'interno di un programma dovrebbero essere sostituibili con i loro sottotipi senza alterare la correttezza del programma stesso.

### Un esempio di codice conforme al principio LSP

Immaginiamo di avere una classe `Billing` che utilizza un'interfaccia `License` con un metodo `calcFee`. Questa interfaccia viene implementata da due classi `PersonalLicense` e `BusinessLicense`:

![](/files/-LyxEZGO14pl38P_vaZ5)

Questo assetto non viola il principio LSP, poiché il comportamento di `Billing` non dipende da quale dei due sottotipi impiega.

### Un esempio di codice che viola il principio LSP

Immaginiamo di avere una classe `Geometry` che utilizza la classe `Rectangle`, la quale ha come sottotipo `Square`.

![](/files/-LyxG95AQvLe-9_ci54h)

Questo assetto viola il principio LSP, poiché `Square` non può essere un sottotipo di `Rectangle` perché l'altezza e la larghezza di un `Rectangle` può variare in modo indipendente, mentre in uno `Square` no! Se adottassimo questo assetto saremmo costretti ad aggiungere un'istruzione `if` all'interno di `Geometry` per verificare il tipo di istanza passata.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mirkorap16.gitbook.io/clean-architecture/il-principio-lsp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
