- From: Claudio Pisa <
>
- To:
- Subject: Esempio di oggi
- Date: Fri, 08 Jan 2010 17:59:22 +0100
Salve a tutti.
Vi allego i sorgenti dell'esempio costruito a lezione da me e dal vostro
collega.
Riassumendo, lo scenario in cui ci siamo posti e' quello di un servizio
di stampa su schermo dei messaggi inviati dagli ascoltatori di una radio.
Abbiamo definito la classe Message (vedere Message.java), con un
attributo, content, incapsulato, ovvero privato ma accessibile dai
metodi pubblici getContent() e setContent() (ovvero i metodi getter e
setter).
Poi abbiamo definito le classi Email, Sms e Chat, tutte e tre
sottoclassi di Message. Queste sottoclassi fanno l'override del metodo
printContent() (vedere Email.java, Chat.java ed Sms.java).
Nel metodo main() della classe Principale (vedere Principale.java)
istanziamo un array, chiamato arr, di oggetti di tipo Message (riga 9) e
lo riempiamo invece con oggetti di tipo Email, Chat ed Sms. Possiamo
fare questa operazione (cioe' riempire un array di oggetti di tipo
Message con oggetti di tipo diverso da Message) solo perche' Email, Chat
ed Sms sono sottoclassi di Message, altrimenti avremmo ottenuto un
errore in fase di compilazione. Si dice che abbiamo una *collezione
eterogenea* (paragrafo 6.3.2 del libro).
Poi scorriamo l'array tramite un ciclo for, o meglio "foreach" (riga
37). Ad ogni ciclo, al reference me, di tipo Message, viene assegnato un
elemento dell'array, e viene richiamato il metodo printContent(). Il
metodo printContent() che viene richiamato e' quello definito nelle
sottoclassi Email, Chat ed Sms e non nella classe Message, nonostante il
reference sia di tipo Message. Si dice quindi che printContent() e' un
*metodo virtuale* [1].
Per chiarire alcuni concetti vi consiglio di:
- eliminare il metodo printContent() dalla classe Chat, ottenendo una
classe "vuota", e vedere come si comporta il programma. Come cambia
l'output del programma? Perche'?
- provare a sostituire il codice alle righe 16-19 di Principale.java
(metodo main) con il seguente codice:
Message s = new Sms();
s.setContent("brutto");
s.setNumero("0000");
arr[2]=s;
Cosa succede? Perche'?
- provare ad aggiungere, all'interno del ciclo for, tra la riga 27 e 28
(attenzione: del codice originale, quindi se avete inserito o tolto
righe piu' in alto i numeri di riga potrebbero essere diversi), delle
istruzioni per anonimizzare i numeri di telefono degli sms. Ovvero,
prima di stampare il contenuto del messaggio, se il messaggio e' un sms,
il numero di telefono dell'sms viene modificato nella stringa "numero
anonimo". Suggerimento: usare l'operatore instanceof ed il casting.
Se volete potete inviarmi il vostro codice e/o le vostre risposte (che
*non* contano per l'esame). E naturalmente, se avete domande o dubbi di
qualunque tipo, scrivete pure in mailing list.
Saluti,
Claudio Pisa
P.S. Augurissimi al prof.!
[1]
http://it.wikipedia.org/wiki/Funzione_virtuale
Attachment:
messageservice.tar.gz
Description: application/gzip
Attachment:
signature.asc
Description: OpenPGP digital signature
- Esempio di oggi, Claudio Pisa
Archivio con motore MhonArc 2.6.16.