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”