Laboratorio di programmazione
Java
Overriding
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
È possibile l’overloading di
funzioni ereditate
 public class B {//CLASSE BASE
public void f(int i) {…}
}
 public class D extends B {
//CLASSE DERIVATA
public void f(String s) {…}
}
 D d = new D();
d.f(1);
//OK: invoca B.f(int)
d.f(“prova”); //OK: invoca D.f(String)
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Overriding di funzioni
 Nella classe derivata è possibile
anche fare overriding
(ridefinizione) delle funzioni della
classe base…
 …definendo nella classe derivata
una funzione con esattamente lo
stessa segnatura della funzione
ereditata…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Overriding di funzioni
 …ogni volta che si invoca detta
funzione su un oggetto della
classe derivata
(indipendentemente dal tipo del
riferimento usato)…
 …viene eseguito il corpo della
funzione ridefinita.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempi

Esempio1.java

Esempio2.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Osservazioni
 I clienti della classe D non
possono più invocare B.f(int)
ma solo D.f(int)…
 …all’interno della classe invece
si può invocare B.f(int) facendo
uso di super (analogo a this).
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Late Binding
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Late binding
 A tempo di compilazione
si controlla solo l’esistenza di
una funzione con la segnatura
richiesta…
 …ma non si creano collegamenti
con il corpo della funzione stessa…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Late binding
 …tali collegamenti sono stabiliti
a runtime in base alla classe
dell’oggetto di invocazione
(e non del riferimento).
 Esempio: LateBinding.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Note sull’overriding
 È possibile cambiare il livello di
accesso della funzione ridefinita,
ma solo allargandolo.
 È possibile bloccare l’overriding
di una funzione qualificandola
final.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
L’overriding di campi dati
non esiste!
 Se nella classe derivata
definiamo un campo dati con
lo stesso nome di un campo dati
della classe base…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
L’overriding di campi dati
non esiste!
 …il campo della classe derivata
nasconde quello della classe base…
 …che però resta accessibile
utilizzando riferimenti del tipo base.
 Esempio:
SovrascritturaCampiDati.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Classi Astratte
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Le classi astratte
 … sono classi che non possono
avere istanze proprie …
 … cioè, sono classi utilizzate
per derivare sottoclassi …
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Le classi astratte
 …possono avere funzioni astratte
cioè dichiarate ma non definite
(la segnatura è presente, ma
il corpo no)…
 …le classi (concrete) derivate
devono fare overriding delle
funzioni astratte.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
 Scrivere una classe Java
per rappresentare figure.
Per ciascuna figura ci interessa
sapere il colore, il perimetro e
l’area
 Figure.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
 Scrivere una classe per
rappresentare figure che sono
rettangoli, triangoli, cerchi
 Rettangolo.java, Triangolo.java,
Cerchio.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio di cliente
di una classe astratta
 Scrivere una funzione cliente
che dato un array di figure,
restituisca la somma dei
perimetri
 ServiziFigure.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Osservazioni
 La funzione è polimorfa…
 …per supportare il polimorfismo
l’overriding e il late binding è
essenziale…
 …facilita notevolmente la
legibilità, il riuso e l’estendibilità.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Interfacce
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Una interfaccia
 …è una astrazione per un insieme
di funzioni pubbliche, delle quali
si definisce la segnatura ma non
il corpo…
 …una classe implementa
l’interfaccia definendo tutte
le funzioni previste dalla stessa.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Sintatticamente …
 …una interfaccia è simile ad una
classe dove…
 …non possono essere presenti
campi dati (eccetto costanti
statiche…)…
 …tutte le funzioni sono astratte
(segnatura, ma non corpo)…
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Esempio
public interface Confrontabile {
boolean maggiore(Confrontabile c);
boolean paritetico(Confrontabile c);
}
//Nota: le funzioni di una interfaccia
//sono implicitamente public
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Data una interfaccia
possiamo costruire classi
che la implementano …
 Persona.java
 Edificio.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Data una interfaccia
possiamo costruire funzioni
(polimorfe) che la usano …
 ServiziCofrontabile.java
 Main.java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Osservazioni
 Le interfacce rappresentano
collezioni di funzionalità…
 …messe a disposizione dalle
classi che le implementano...
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Osservazioni
 …sfruttando il polimorfismo,
possiamo costruire clienti che
fanno uso di dette funzionalità,
indipendentemente da come
sono implementate (riuso)
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Differenza tre interfacce e
classi astratte
 …una classe astratta è una classe,
cioè una astrazione di un insieme
di oggetti simili (quelli delle sue
sottoclassi)…
 …una interfaccia è una semplice
astrazione di un insieme di
funzionalità...
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Differenza tre interfacce e
classi astratte
 …pensare Confrontabile come una
astrazione sia delle persone che
degli edifici solo perché entrambi
dispongono delle funzionalità di
confronto maggiore() e
paritetico() è una forzatura.
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Altre caratteristiche
delle interfacce Java
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
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(){…}
}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
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(){…}
}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Laboratorio di programmazione
Java
Java supporta ereditarietà multipla
per le interfacce (non per le classi)…
 public
public
public
{void
interface I {void g();}
interface J {void h();}
interface M extends I,J
k();}
public class C implements M {
void g(){…} void h(){…} void k(){…}
}
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”