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