33
Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma “La Sapienza” Overriding

Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Embed Size (px)

Citation preview

Page 1: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

OverridingOverriding

Page 2: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

public class D extends B { //CLASSE DERIVATA public void f(String s) {…}}

public class D extends B { //CLASSE DERIVATA public void f(String s) {…}}

È possibile l’overloading di funzioni ereditateÈ possibile l’overloading di funzioni ereditate

public class B {//CLASSE BASE public void f(int i) {…}}

public class B {//CLASSE BASE public void f(int i) {…}}

D d = new D();d.f(1); //OK: invoca B.f(int)d.f(“prova”); //OK: invoca D.f(String)

D d = new D();d.f(1); //OK: invoca B.f(int)d.f(“prova”); //OK: invoca D.f(String)

Page 3: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Nella classe derivata è possibile anche fare overriding (ridefinizione) delle funzioni della classe base…

Nella classe derivata è possibile anche fare overriding (ridefinizione) delle funzioni della classe base…

Overriding di funzioniOverriding di funzioni

…definendo nella classe derivata una funzione con esattamente lo stessa segnatura della funzione ereditata…

…definendo nella classe derivata una funzione con esattamente lo stessa segnatura della funzione ereditata…

Page 4: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…ogni volta che si invoca detta funzione su un oggetto della classe derivata (indipendentemente dal tipo del riferimento usato)…

…ogni volta che si invoca detta funzione su un oggetto della classe derivata (indipendentemente dal tipo del riferimento usato)…

Overriding di funzioniOverriding di funzioni

…viene eseguito il corpo della funzione ridefinita.

…viene eseguito il corpo della funzione ridefinita.

Page 5: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Esempio1.java Esempio1.java

EsempiEsempi

Esempio2.java Esempio2.java

Page 6: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

I clienti della classe D non possono più invocare B.f(int) ma solo D.f(int)…

I clienti della classe D non possono più invocare B.f(int) ma solo D.f(int)…

OsservazioniOsservazioni

…all’interno della classe invece si può invocare B.f(int) facendo uso di super (analogo a this).

…all’interno della classe invece si può invocare B.f(int) facendo uso di super (analogo a this).

Page 7: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Late BindingLate Binding

Page 8: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

A tempo di compilazione si controlla solo l’esistenza di una funzione con la segnatura richiesta…

A tempo di compilazione si controlla solo l’esistenza di una funzione con la segnatura richiesta…

Late bindingLate binding

…ma non si creano collegamenti con il corpo della funzione stessa…

…ma non si creano collegamenti con il corpo della funzione stessa…

Page 9: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…tali collegamenti sono stabiliti a runtime in base alla classe dell’oggetto di invocazione (e non del riferimento).

…tali collegamenti sono stabiliti a runtime in base alla classe dell’oggetto di invocazione (e non del riferimento).

Late bindingLate binding

Esempio: LateBinding.java Esempio: LateBinding.java

Page 10: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

È possibile cambiare il livello di accesso della funzione ridefinita, ma solo allargandolo.

È possibile cambiare il livello di accesso della funzione ridefinita, ma solo allargandolo.

Note sull’overridingNote sull’overriding

È possibile bloccare l’overriding di una funzione qualificandola final.

È possibile bloccare l’overriding di una funzione qualificandola final.

Page 11: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Se nella classe derivata definiamo un campo dati con lo stesso nome di un campo dati della classe base…

Se nella classe derivata definiamo un campo dati con lo stesso nome di un campo dati della classe base…

L’overriding di campi dati non esiste!L’overriding di campi dati non esiste!

Page 12: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…il campo della classe derivata nasconde quello della classe base…

…il campo della classe derivata nasconde quello della classe base…

…che però resta accessibile utilizzando riferimenti del tipo base.

…che però resta accessibile utilizzando riferimenti del tipo base.

Esempio: SovrascritturaCampiDati.java

Esempio: SovrascritturaCampiDati.java

L’overriding di campi dati non esiste!L’overriding di campi dati non esiste!

Page 13: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Classi AstratteClassi

Astratte

Page 14: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

… sono classi che non possono avere istanze proprie …

… sono classi che non possono avere istanze proprie …

Le classi astratteLe classi astratte

… cioè, sono classi utilizzate per derivare sottoclassi …

… cioè, sono classi utilizzate per derivare sottoclassi …

Page 15: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…possono avere funzioni astratte cioè dichiarate ma non definite (la segnatura è presente, ma il corpo no)…

…possono avere funzioni astratte cioè dichiarate ma non definite (la segnatura è presente, ma il corpo no)…

Le classi astratteLe classi astratte

…le classi (concrete) derivate devono fare overriding delle funzioni astratte.

…le classi (concrete) derivate devono fare overriding delle funzioni astratte.

Page 16: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Scrivere una classe Java per rappresentare figure. Per ciascuna figura ci interessa sapere il colore, il perimetro e l’area

Scrivere una classe Java per rappresentare figure. Per ciascuna figura ci interessa sapere il colore, il perimetro e l’area

EsempioEsempio

Figure.java Figure.java

Page 17: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Scrivere una classe per rappresentare figure che sono rettangoli, triangoli, cerchi

Scrivere una classe per rappresentare figure che sono rettangoli, triangoli, cerchi

EsempioEsempio

Rettangolo.java, Triangolo.java, Cerchio.java

Rettangolo.java, Triangolo.java, Cerchio.java

Page 18: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Scrivere una funzione cliente che dato un array di figure, restituisca la somma dei perimetri

Scrivere una funzione cliente che dato un array di figure, restituisca la somma dei perimetri

Esempio di cliente di una classe astrattaEsempio di cliente di una classe astratta

ServiziFigure.java ServiziFigure.java

Page 19: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

La funzione è polimorfa… La funzione è polimorfa…

OsservazioniOsservazioni

…per supportare il polimorfismo l’overriding e il late binding è essenziale…

…per supportare il polimorfismo l’overriding e il late binding è essenziale…

…facilita notevolmente la legibilità, il riuso e l’estendibilità.

…facilita notevolmente la legibilità, il riuso e l’estendibilità.

Page 20: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

InterfacceInterfacce

Page 21: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…è una astrazione per un insieme di funzioni pubbliche, delle quali si definisce la segnatura ma non il corpo…

…è una astrazione per un insieme di funzioni pubbliche, delle quali si definisce la segnatura ma non il corpo…

Una interfacciaUna interfaccia

…una classe implementa l’interfaccia definendo tutte le funzioni previste dalla stessa.

…una classe implementa l’interfaccia definendo tutte le funzioni previste dalla stessa.

Page 22: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…una interfaccia è simile ad una classe dove…

…una interfaccia è simile ad una classe dove…

Sintatticamente …Sintatticamente …

…non possono essere presenti campi dati (eccetto costanti statiche…)…

…non possono essere presenti campi dati (eccetto costanti statiche…)…

…tutte le funzioni sono astratte (segnatura, ma non corpo)…

…tutte le funzioni sono astratte (segnatura, ma non corpo)…

Page 23: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

public interface Confrontabile { boolean maggiore(Confrontabile c); boolean paritetico(Confrontabile c);}

//Nota: le funzioni di una interfaccia //sono implicitamente public

public interface Confrontabile { boolean maggiore(Confrontabile c); boolean paritetico(Confrontabile c);}

//Nota: le funzioni di una interfaccia //sono implicitamente public

EsempioEsempio

Page 24: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Persona.java Persona.java

Data una interfaccia possiamo costruire classi che la implementano …

Data una interfaccia possiamo costruire classi che la implementano …

Edificio.java Edificio.java

Page 25: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

ServiziCofrontabile.java ServiziCofrontabile.java

Data una interfaccia possiamo costruire funzioni (polimorfe) che la usano …

Data una interfaccia possiamo costruire funzioni (polimorfe) che la usano …

Main.java Main.java

Page 26: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Le interfacce rappresentano collezioni di funzionalità…

Le interfacce rappresentano collezioni di funzionalità…

OsservazioniOsservazioni

…messe a disposizione dalle classi che le implementano...

…messe a disposizione dalle classi che le implementano...

Page 27: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…sfruttando il polimorfismo, possiamo costruire clienti che fanno uso di dette funzionalità, indipendentemente da come sono implementate (riuso)

…sfruttando il polimorfismo, possiamo costruire clienti che fanno uso di dette funzionalità, indipendentemente da come sono implementate (riuso)

OsservazioniOsservazioni

Page 28: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…una classe astratta è una classe, cioè una astrazione di un insieme di oggetti simili (quelli delle sue sottoclassi)…

…una classe astratta è una classe, cioè una astrazione di un insieme di oggetti simili (quelli delle sue sottoclassi)…

Differenza tre interfacce e classi astratteDifferenza tre interfacce e classi astratte

…una interfaccia è una semplice astrazione di un insieme di funzionalità...

…una interfaccia è una semplice astrazione di un insieme di funzionalità...

Page 29: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

…pensare Confrontabile come una astrazione sia delle persone che degli edifici solo perché entrambi dispongono delle funzionalità di confronto maggiore() e paritetico() è una forzatura.

…pensare Confrontabile come una astrazione sia delle persone che degli edifici solo perché entrambi dispongono delle funzionalità di confronto maggiore() e paritetico() è una forzatura.

Differenza tre interfacce e classi astratteDifferenza tre interfacce e classi astratte

Page 30: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Altre caratteristiche delle interfacce JavaAltre caratteristiche delle interfacce Java

Page 31: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Una classe può implementare più di una interfaccia…Una classe può implementare più di una interfaccia…

public interface I { void g(); }public interface J { void h(); }

public class C implements I,J { void g(){…} void h(){…}}

public interface I { void g(); }public interface J { void h(); }

public class C implements I,J { void g(){…} void h(){…}}

Page 32: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Una interfaccia può essere derivata da un’altra interfaccia…Una interfaccia può essere derivata da un’altra interfaccia…

public interface I { void g(); }public interface J extends I {void h();}

public class C implements J { void g(){…} void h(){…}}

public interface I { void g(); }public interface J extends I {void h();}

public class C implements J { void g(){…} void h(){…}}

Page 33: Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Overriding

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Java supporta ereditarietà multipla per le interfacce (non per le classi)…Java supporta ereditarietà multipla per le interfacce (non per le classi)…

public interface I {void g();}public interface J {void h();}public interface M extends I,J {void k();}

public class C implements M { void g(){…} void h(){…} void k(){…}}

public interface I {void g();}public interface J {void h();}public interface M extends I,J {void k();}

public class C implements M { void g(){…} void h(){…} void k(){…}}