4. Principio di sostituzione

Specifica di estensioni

Estensione è in Java il termine per l’ereditarietà: un’estensione C’ di una classe C è un erede di C.

Un’estensione è detta pura se non modifica la specifica dei metodi ereditati:

AF e RI di un’estensione

L’AF di una sottoclasse di solito è uguale a quella della super-classe.

Il RI della super-classe è ereditato senza modifiche e si aggiunge un nuovo RI.

Principio di sostituzione di Liskov

Gli oggetti della sottoclasse devono rispettare il contratto della super-classe: il contratto può essere esteso per coprire ulteriori casi, ma non può essere cambiato.

Questo garantisce che moduli che usano oggetti di un tipo devono poter usare oggetti di un tipo derivato, senza accorgersi della differenza.

Regole per la specifica di sottoclassi

Come si garantisce che il contratto dell’estensione dia compatibile con quello della super-classe?

Basta mostrare le seguenti tre proprietà della specifica dei tipi per avere la compatibilità:

Regola dei metodi

Affinché la chiamata ad un metodo del sottotipo abbia lo stesso effetto, basta che la specifica sia la stessa.

Ma a volte la specifica del metodo deve essere cambiata. Allora valgono le seguenti regole:

Effetto degli operatori logici

JML ed estensioni

Come si ridefinisce in JML la specifica di un metodo?

Una sottoclasse eredita pre e post condizioni dei metodi pubblici e protetti della super-classe e i suoi invarianti pubblici.

Da un punto di vista sintattico basta fare così:

//@also
//@requires
//@ensures

Da un punto di vista semantico accade che:

Eliminazione delle eccezioni

Quando si ridefinisce in una sottoclasse un metodo della superclasse è possibile eliminare le eccezioni se e solo se l’eccezione che si vuole eliminare non è usata o se il suo lancio è opzionale.