La classe Object
Transcript
La classe Object
Programmazione ad Oggetti Ereditarietà La classe Object ! Tutte le classi ereditano implicitamente da Object ! I reference a Object rappresentano i reference universali " Equivalenti a void* in C ! Metodi probabilmente da ridefinire: " String toString() " boolean equals(Object other) – Possibly keep hashCode() consistent Equals() ! L implementazione di default (Object) confronta i reference public boolean equals(Object other){ return this == other; } ! Tipicamente confronta attributi public boolean equals(Object other){ return this.field.equals(other.field); } toString() ! L implementazione di default (Object) restituisce: " thePackage.theClass@a3ffc0de ! Dovrebbe stampare i contenuti dell oggetto " Utile ai fini del debug public String toString(){ return field= + this.field; } String: == vs. equals() ! L’operatore == confronta i riferimenti ! Il metodo equals() confronta gli oggetti ! Es. String s1 = “A”; String s2 = new String(“A”); if(s1!=s2) // due oggetti distinti if(s1.equals(s2)) // stesso contenuto Esempio - pubblicazioni Pubblicazione -autore -titolo -anno +print() Libro -editore +print() Rivista -rivista -mese +print() Quotidiano -giorno +getGiorno() Polimorfismo & Up-cast ! Polimorfismo " È sempre possibile vedere un oggetto attraverso un riferimento ad una delle sue classi di base ! Up-cast " Cast da una classe derivata ad una classe di base " E eseguito automaticamente dal compilatore Esempio Quotidiano q = new Quotidiano ("Buongiorno","2005", "Gramellini","La Stampa", "Ottobre","12"); q.getGiorno(); // OK Rivista q_come_rivista = q; q_come_rivista.getGiorno(); // NO Pubblicazione q_come_pubb = q; q_come_pubb.getGiorno(); // NO Dynamic binding ! All invocazione di un metodo, la JVM invoca il metodo definito nella classe effettiva dell oggetto " Indipendentemente dal tipo del riferimento " Se un metodo non è definito viene risalita la gerarchia fino a trovare il metodo Dynamic binding Rivista r = new Rivista("Rubrica", "2005","Pippo", "Panorama","Settembre"); stampa(r); stampa(q); … stampa(Pubblicazione pubb){ pubb.print(); } Quale variante di print() viene richiamata? am0 Composite pattern Forma Punto Rettangolo Gruppo Architettura Biblioteca GestioneComandi Biblioteca Scaffale Stretta correlazione: ogni modifica in Biblioteca si ripercuote su GestioneComandi Libro Interfaccia GestioneComandi Presentazione Biblioteca GestioneBibl ioteca L interfaccia disaccoppia logica e presentazione Scaffale Lib ro Logica Problema ! Nelle interfacce utente a carattere, ci sono una serie di operazioni ricorrenti " Prompt " Lettura comando " Quit " Help ! Come faccio a riutilizzare il piu possibile? Soluzione: Fattorizzazione ! Si raccoglie in una classe tutto quello che è in comune ! Si definisce un metodo che esegue l algoritmo comune " Richiama altri metodi che possono essere ridefiniti nelle classi derivate Esempio Command +Command() +start() +decode() +quit() +help() +prompt() AppCmd +decode() AppCmd2 +decode() +help() +prompt() Pattern: Template Method ! Il metodo start() definisce " Comportamento comune delle interfacce a linea di comando (CLI) " Definisce un algoritmo basato su operazioni atomiche ! Le operazioni atomiche " Sono implementate da metodi " Si possono ridefinire per personalizzare Esercizio Espressioni aritmetiche Esercizio: espressioni ! Rappresentare espressioni aritmetiche su variabili e costanti. ! Il valore delle variabili può essere modificato in qualsiasi istante. ! Un’espressione può essere ricalcolata in qualsiasi istante utilizzando il valore attuale delle variabili. Abstract Syntax Tree Soluzione: AST ! Espressione " 3 * ( x + 2 ) ! Rappresentazione: * 3 + x ! Il valore di un’espressione può essere calcolato con una visita dell’albero. 2 Ipotesi di soluzione left Node - Distingue operandi e operatori right type: {opnd, optr} value: int operator: {+,-,*,/} name: String Valore delle costanti e variabili Tipo di operatore - evaluate() Nome delle variabili • Presenza di campi tipo • Attributi utili in casi diversi Ereditarietà Classi per Espressioni secondo primo Espressione valuta() stampa() Operatore Somma Operando Prodotto Costante Variabile