1 Interfacce e polimorfismo Sandro Pedrazzini Approfondimento Interfacce e polimorfismo.

Slides:



Advertisements
Presentazioni simili
Informatica Recupero debito quarto anno Terzo incontro.
Advertisements

Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Le gerarchie di tipi.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
Interfacce. Interfacce come strumento di progetto Scelta delle classi di un progetto Criteri di coesione e accoppiamento Interfacce e riuso di codice.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 12 (19 novembre 2008) Programmazione in Java: i metodi statici.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Array Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
1 Corso di Informatica (Programmazione) Lezione 13 (21 novembre 2008) Programmazione in Java: stringhe e array.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Overriding.
Soluzione Esercizio - Classe Vettore
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Oggetti e dati primitivi
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Approfondimento delle classi
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Progetto di applicazioni grafiche. Disegno di forme complesse Prassi : un classe per ciascuna forma Progetta la forma individuando le componenti base.
Programmazione con Interfacce
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Espressioni condizionali
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
Elementi di Informatica di base
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Unità Didattica 3 Linguaggio C
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
1 Incapsolamento (intro) Sandro Pedrazzini Approfondimento Incapsolamento (introduzione)
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Fondamenti di Programmazione Prof.ssa Elisa Tiezzi
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Videopoker esempio di applicazione in java. 2 Videopoker Un giocatore, con un portofaglio iniziale il giocatore punta il banco da 5 carte il giocatore.
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Programmazione ad oggetti
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Gestione dei thread in Java
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
Corso di Algoritmi e Strutture Dati con Laboratorio A.A. 2015/16 Oltre le classi.
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

1 Interfacce e polimorfismo Sandro Pedrazzini Approfondimento Interfacce e polimorfismo

2 Interfacce e polimorfismo Sandro Pedrazzini Motivazione Importanza del polimorfismo nellutilizzo dei pattern e, più In generale, nella programmazione OO Ruolo degli elementi interface Disaccoppiamento degli elementi Programmazione generica Estensione di funzionalità esistente

3 Interfacce e polimorfismo Sandro Pedrazzini Interface Separazione del concetto di interfaccia da quello di classe Più classi possono realizzare la stessa interfaccia Sci calcolaImporto(…) Carving calcolaImporto(…) Bambini calcolaImporto(…) Normale calcolaImporto(…)

4 Interfacce e polimorfismo Sandro Pedrazzini Esempio 1: genericità con linterfaccia Icon Java mette a disposizione il metodo showMessageDialog(...) per mostrare un dialogo in interfaccia JOptionPane.showMessageDialog(null,"Hello World");

5 Interfacce e polimorfismo Sandro Pedrazzini Scelta dellicona (1) Esistono altri overloading del metodo showMessageDialog(...). Ne scegliamo uno che ci permetta di specificare cosa mostrare come immagine nel messaggio. class JOptionPane extends JComponent implements Accessible {... public static void showMessageDialog( Component parentComponent, Object message, String title, int messageType, Icon icon) {...} }

6 Interfacce e polimorfismo Sandro Pedrazzini Scelta dellicona (2) JOptionPane.showMessageDialog( null, "Hello World, message dialog, JOptionPane.INFORMATION_MESSAGE, new ImageIcon(lampadina.gif));

7 Interfacce e polimorfismo Sandro Pedrazzini Nuova scelta Supponiamo ora di voler visualizzare nel messaggio una forma grafica senza dover generare precedentemente un file contenente limmagine. Visto che showMessageDialog(...) accetta un elemento di tipo Icon, non siamo obbligati a passare ImageIcon, ma possiamo fornire un oggetto di qualsiasi classe che realizzi linterfaccia Icon.

8 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Icon (1) public interface Icon { int getIconWidth(); int getIconHeight(); void paintIcon( Component c, Graphics g, int x, int y); }

9 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Icon (2) Uninterfaccia non contiene una realizzazione di funzionalità. Specifica semplicemente un insieme di metodi. Qualsiasi classe che implementi linterfaccia Icon ha due responsabilità: –Fornire la dimensione dellicona –Disegnare licona.

10 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Icon (3) Il parametro Component di paintIcon() rappresenta il componente grafico che deve contenere limmagine. Da questo è possibile ottenere alcune proprietà, come il colore dello sfondo, il font, ecc. È quindi possibile disegnare limmagine nellarea grafica (Graphics) in modo che si adatti al contesto in cui viene disegnata.

11 Interfacce e polimorfismo Sandro Pedrazzini Implementazione (1) Realizziamo una classe WorldIcon che implementa Icon. La classe disegna un cerchio rappresentante il mondo. Un oggetto di questa classe potrà essere passato al metodo showMessageDialog(), che non ha bisogno di conoscere la classe WorldIcon. Gli basta sapere che si comporta come (implementa) Icon.

12 Interfacce e polimorfismo Sandro Pedrazzini Implementazione (2) Icon paintIcon(…) WorldIcon paintIcon(…) ImageIcon paintIcon(…)

13 Interfacce e polimorfismo Sandro Pedrazzini Implementazione (2) public class WorldIcon implements Icon{ private int fSize; public WorldIcon(int size){ fSize = size; } public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2 = (Graphics2D)g; Ellipse2D.Double world = new Ellipse2D.Double(x,y,fSize, fSize); g2.setColor(Color.BLUE); g2.fill(world); } public int getIconWidth() { return fSize; } public int getIconHeight() { return fSize; }

14 Interfacce e polimorfismo Sandro Pedrazzini Utilizzo JOptionPane.showMessageDialog( null,"Hello World", "message dialog", JOptionPane.INFORMATION_MESSAGE, new WorldIcon(60));

15 Interfacce e polimorfismo Sandro Pedrazzini Considerazioni (1) Chi realizza il metodo showMessageDialog() non ha nessuna idea di quale tipo di icona verrà passata. Le classi utilizzate per realizzare licona possono essere completamente diverse. Lunica cosa in comune consiste nellimplementare linterfaccia Icon. Solo quando viene chiamato in showMessageDialog() un metodo di Icon, linterprete Java cerca di identificare il vero tipo delloggetto.

16 Interfacce e polimorfismo Sandro Pedrazzini Considerazioni (2) Il polimorfismo è caratterizzato proprio da questa capacità di selezionare il metodo appropriato per un certo oggetto. Un utilizzo importante del polimorfismo consiste nel fornire meccanismi che si comportino come accoppiamento rilassato. Nel nostro caso: il metodo showMessageDialog() non ha bisogno di nessuna informazione di come WorldIcon elabori limmagine. È solamente interessato alle chiamate allinterfaccia Icon. Non esiste nessun accoppiamento tra JOptionPane e WorldIcon.

17 Interfacce e polimorfismo Sandro Pedrazzini Considerazioni (3) Quando utilizziamo la classe di una libreria di terzi, prima viene implementata la libreria, poi il nostro programma principale che la utilizza. Quando creiamo una nostra sottoclasse da usare in modo polimorfico, il programma principale che la utilizza può essere stato implementato da terzi ben prima che noi mettiamo a disposizione la nostra funzionalità specifica => Principio del framework

18 Interfacce e polimorfismo Sandro Pedrazzini Esempio 2: Comparable Altro esempio di codice generico con lutilizzo del polimorfismo Metodo statico sort() della classe Collections, in grado di ordinare una lista qualsiasi. List list =...; Collections.sort(list);

19 Interfacce e polimorfismo Sandro Pedrazzini Comparable (1) I singoli oggetti della lista possono appartenere a una classe qualsiasi, a patto che implementi linterfaccia Comparable. public interface Comparable { int compareTo(T other); } La chiamata a compareTo() restituisce un valore negativo se loggetto invocante precede loggetto parametro, zero se i due oggetti sono uguali e un valore positivo

20 Interfacce e polimorfismo Sandro Pedrazzini Comparable (2) Come mai tutti gli oggetti devono essere di tipo Comparable? Perché lalgoritmo di sort, chiamando compareTo() riesce a decidere gli spostamenti degli oggetti, senza dover conoscere il loro vero tipo. Comparable object1 =...; if (object1.compareTo(object2) > 0){ sposta object1 rispetto a object2 }

21 Interfacce e polimorfismo Sandro Pedrazzini Comparable (3) Esempio 1: String realizza Comparable List countries = new ArrayList (); countries.add(Switzerland); countries.add(Belgium); countries.add(Germany); Collections.sort(countries);...

22 Interfacce e polimorfismo Sandro Pedrazzini Comparable (4) Esempio 2: Realizzazione di una nuova classe public class Country implements Comparable { private String fName; private double fArea; public Country(String name, double area){ fName = name; fArea = area; } public String getName() { return fName; } public double getArea() { return fArea; } Criterio di ordinamento: dimensione della superficie del territorio public int compareTo(Country other) { if (fArea < other.getArea()){ return -1; } if (fArea > other.getArea()){ return 1; } return 0; }

23 Interfacce e polimorfismo Sandro Pedrazzini Comparable (5) Utilizzo della classe Country, con ordinamento secondo la grandezza in km 2 public class CountryTry { public static void main(String[] args) { List countries = new ArrayList (); countries.add(new Country("Belgium",77000)); countries.add(new Country("Switzerland",41000)); countries.add(new Country("Uruguay",440000));... Collections.sort(countries); for (Country country : countries){ System.out.println(country.getName() + " " + country.getArea()); }

24 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (1) Se ora volessimo ordinare le stesse nazioni dellesempio 2 in base al nome, invece che in base alla superficie, dovremmo ridefinire il metodo compareTo(). Oltre che essere scomodo, ci obbligherebbe a definire sottoclassi unicamente per distinguere diversi metodi compareTo() (modifica del design per scopi che con il design nulla hanno a che vedere)

25 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (2) Soluzione: utilizzo di un overloading di sort(), che accetta come secondo parametro un oggetto Comparator Gli oggetti presenti in List vengono ordinati in base allordinamento definito in Comparator. class Collections {... public static void sort(List list, Comparator c) {... }

26 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (3) La lista List può ora contenere oggetti di qualsiasi tipo. Non è più necessario che appartengano a classi che implementino uninterfaccia particolare. public class Country { private String fName; private double fArea; public Country(String name, double area){ fName = name; fArea = area; } public String getName() { return fName; } public double getArea() { return fArea; }

27 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (4) public class ComparatorByName implements Comparator { public int compare(Country country1, Country country2) { String name1 = country1.getName(); String name2 = country2.getName(); return name1.compareTo(name2); //implementato in String }

28 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (5) public class ComparatorByArea implements Comparator { public int compare(Country country1, Country country2) { String area1 = country1.getArea(); String area2 = country2.getArea(); if (area1 < area2){ return -1; } if (area1 > area2){ return 1; } return 0; }

29 Interfacce e polimorfismo Sandro Pedrazzini Interfaccia Comparator (6) Utilizzo di ComparatorByName public class CountryTry2 { public static void main(String[] args) { List countries = new ArrayList (); countries.add(new Country("Switzerland", 15000)); countries.add(new Country("Uruguay", )); countries.add(new Country("Belgium", 30000));... Collections.sort(countries, new ComparatorByName()); for (Country country : countries) { System.out.println(country.getName() + " " + country.getArea()); }

30 Interfacce e polimorfismo Sandro Pedrazzini Overriding di equals() e hashCode() (1) Una comune sorgente di errore in applicazioni Java consiste nel dimenticare di riscrivere il metodo hashCode() ogni volta che si riscrive equals(). Il metodo hashCode() viene usato quando si ha a che fare con elementi di Collection, come liste e tabelle hash.

31 Interfacce e polimorfismo Sandro Pedrazzini Overriding di equals() e hashCode() (2) Il contratto, come specificato in Object, prevede 1.hashCode() deve restituire sempre lo stesso valore se chiamato più volte sullo stesso oggetto (non necessariamente lo stesso tra unesecuzione e laltra) 2.Se due oggetti sono uguali rispetto a equals(), anche i loro metodi hasCode() devono restituire lo stesso risultato 3.Se due oggetti sono diversi, rispetto a equals(), non è detto che hashCode() debba restituire risultati diversi. Se però si fa in modo che anche le hashCode() restituiscono risultati diversi, anche la performance di tabelle hash migliora

32 Interfacce e polimorfismo Sandro Pedrazzini Oggetti uguali, stesso hashCode Lerrore più frequente capita con il punto 2: oggetti uguali devono avere lo stesso valore di hash –Capita infatti che due oggetti siano uguali dal punto di vista logico (overriding di equals()), ma dal loro valore di hash sono diversi –Il metodo hashCode() viene ereditato da Object, che assegna un hashCode diverso ad ogni nuovo oggetto (tipicamente convertendo lindirizzo di allocazione in un int, anche se non devessere necessariamente così)

33 Interfacce e polimorfismo Sandro Pedrazzini Esempio (1) public class Country { private String fName; private double fArea; public Country(String name, double area){ fName = name; fArea = area; } public String getName() { return fName; } public double getArea() { return fArea; } public boolean equals(Object o) { if (o == this){ return true; } if (!o instanceof Country) { return false; } Country county = (Country)o; return country.getName().equals(fName) && country.getArea() == fArea; }

34 Interfacce e polimorfismo Sandro Pedrazzini Esempio (2) Supponiamo ora di voler usare questa classe con HashMap Map population = new HashMap (); population.put(new Country(Switzerland, 15000), ); Ci si aspetterebbe che unespressione del genere restituisca il valore di 7 milioni, invece restituisce null population.get(new Country(Switzerland, 15000)); gli oggetti coinvolti sono 2 e il fatto di aver omesso limplementazione di hashCode() causa un diverso valore per istanze diverse

35 Interfacce e polimorfismo Sandro Pedrazzini Esempio (3) Bisogna allora provvedere a fornire un hashCode che sia uguale per istanze equals Variante semplice, ma da non usare !! public int hashCode() { return 150; }

36 Interfacce e polimorfismo Sandro Pedrazzini Esempio (4) Un codice fisso è legale perché assicura che oggetti uguali abbiano lo stesso hashCode Non è una buona soluzione, perché fa in modo che TUTTI gli oggetti abbiano hashCode uguale. In questo modo tutti gli oggetti in una hash table avrebbero stessa chiave, facendo degenerare la tabella in una lista semplice, con i costi che ne derivano

37 Interfacce e polimorfismo Sandro Pedrazzini hashCode (1) Una buona funzione di hash tende a produrre valori diversi di hash per oggetti diversi Ci sono varie ricette su come generare valori di hashCode Alcuni elementi da considerare: –Cercare di considerare tutti i campi significativi usati in equals() –Tralasciare i campi ridondanti (calcolati da altri campi) –Se un campo è un array, trattarlo come se ogni elemento fosse un campo separato

38 Interfacce e polimorfismo Sandro Pedrazzini hashCode (2) Esempio tratto da Bloch, Effective Java –Registra una costante iniziale nella variabile risultato (esempio: 17) –Per ogni campo genera un valore intero »Per ogni elemento di tipo scalare, usare il valore effettivo »byte, char, short, int => (int) f »float => Float.floatToIntBits(f) »long => (int) (f^(f >>> 32) (xor con shift a destra di 4 byte) »Per riferimenti a oggetti che in equals() sono usati attraverso il loro equals(), usare il loro valore di hashCode() –Combinare tutti i valori ottenuti in questo modo: risultato = 31 * risultato + valore Verificare che a istanze uguali corrispondano valori uguali Il valore 31 è scelto perché numero primo. Un vantaggio di 31 consiste nel fatto che la moltiplicazione può essere rimpiazzata da uno shift e sottrazione, più performanti. 31 * i == (i << 5) -i Moderne VM eseguono automaticamente questo tipo di ottimizzazione

39 Interfacce e polimorfismo Sandro Pedrazzini Esempio public class Country { private String fName; private double fArea;... public boolean equals(Object o) { if (o == this){ return true; } if (!o instanceof Country) { return false; } Country county = (Country)o; return country.getName().equals(fName) && country.getArea() == fArea; } public int hashCode() { int result = 17; result = 31 * result + fName.hashCode(); long areaCode = Double.doubleToLongBits(fArea); result = 31 * result + (int)(areaCode ^(areaCode >>> 32)); return result; }