Principio di sostituzione Se un oggetto di tipo S può essere sostituito ovunque ci si aspetti un oggetto di tipo T,
allora S è una sottoclasse corretta di TBarbara Liskov (1988)
Principio di sostituzione Se un oggetto di tipo S può essere sostituito ovunque ci si aspetti un oggetto di tipo T,
allora S è una sottoclasse corretta di T
Barbara Liskov (1988)
Asserzioni ed ereditarietà
Alle sottoclassi è concesso
Aggiungere variabili e/o metodi, rispettando il vincolo semantico:
invsottoclasse → invclasse
Ridefinire metodi ereditati, soddisfando i vincoli semantici:
postsottoclasse → postclasse
preclasse → presottoclasse
Il subtyping
da Linguaggi di Programmazione
(prof. G. Lamperti)
Caratteristiche della sottoclasse che garantiscono il subtyping
stesso
protocollo
=
numero, ordine e tipo
dei parametri formali
+
tipo del valore di ritorno Controvarianza dei parametri di input Covarianza del parametro di output Assieme al nome del metodo costituisce la signature da Linguaggi di Programmazione
(prof. G. Lamperti) Aggiunta di variabili e/o metodi
Ridefinizione “compatibile” di metodi ereditati
Controvarianza dei parametri di input I parametri di input del metodo ridefinito nella sottoclasse sono supertipi dei rispettivi parametri del metodo della superclasse
Si allarga il tipo
Covarianza del parametro di output Il parametro di output del metodo ridefinito nella sottoclasse è sottotipo del parametro di uscita del metodo della superclasse
Si restringe il tipo
LP e Ing. del Software B
I parametri di input del metodo ridefinito nella sottoclasse sono supertipi dei rispettivi parametri del metodo della superclasse
preclasse → presottoclasse
Il parametro di output del metodo ridefinito nella sottoclasse è sottotipo del parametro di uscita del metodo della superclasse
postsottoclasse → postclasse
Esempio
da Linguaggi di Programmazione
(prof. G. Lamperti) covarianza del parametro di output
stesso verso rispetto al subclassing controvarianza del parametro di input:
va controcorrente rispetto al subclassing Funziona sia che p referenzi C1 che C2: vale il principio di sostituibilità
Esempio (2)
Caso canonico:
p referenzia oggetto di C1
y = p -> m(x) Caso critico:
p referenzia oggetto di C2
y = p -> m(x) C C’ C C’ si assegna uno studente (val ritornato) ad una persona: ok si ha uno studente come parametro… è prevista una persona: ok (ne è sottotipo) tipi definiti nel metodo m da Linguaggi di Programmazione
(prof. G. Lamperti)
Comments