Interfaccia

21
LEZIONE DEL PROF. SILVANO NATALIZI DI NOVEMBRE 2008 PER LA CLASSE IV A LICEO TECNICO Interfaccia Java

description

definire una interfaccia per dare un protocollo

Transcript of Interfaccia

Page 1: Interfaccia

LEZIONE DEL PROF. SILVANO NATALIZIDI NOVEMBRE 2008

PER LA CLASSE IV A LICEO TECNICO

Interfaccia Java

Page 2: Interfaccia

I metodi della classe sono un contratto

Quando scrivete una classe, quasi sempre esponete alcuni dei suoi metodi a del codice esterno alla classe.

Per rendere disponibile un metodo, dovete renderlo accessibile, di solito facendolo pubblico (public)

Page 3: Interfaccia

Quali sono tutti i metodi di una classe che definiscono il suo contratto ?

Prendiamo la classe Cane. I suoi metodi definiscono l’essere cane. Essi sono il suo contratto.

Ma non sono tutto il suo essereInfatti Cane eredita i metodi pubblici di tutte le sue

superclassi !Ogni cosa della classe Canina fa parte del suo

contrattoOgni cosa della classe Animale fa parte del suo

contrattoOgni cosa della classe Object fa parte del suo

contratto

Page 4: Interfaccia

Cosa succede se dobbiamo modificare il contratto di una classe?

Se volete usare il programma di simulazione degli animali per farne uno di animali domestici ?

Non si può perché nella classe Cane non è stato ancora inserito il comportamento di animale domestico (Pet)

Ad esempio mancano i metodi beFriendly(), play().

Page 5: Interfaccia

Come si introduce il nuovo comportamento ?

No problem: basta aggiungere i nuovi metodi beFriendly() e play() alla classe Cane !

Così facendo non si interferisce con il codice di altre classi perché non si tocca il codice esistente che qualcun altro potrebbe stare utilizzando.

Ma…

Page 6: Interfaccia

C’è qualche problema con l’inserire i metodi Pet direttamente nella classe

Cane ?

Quello che si vuole realizzare è un PetShop programma. Non ci sono solo i Cani !

Che cosa succede se qualcuno volesse usare la classe Cane per fare un programma nel quale ci siano cani selvaggi (wild dogs)?

Cerca di immaginare come si può risolvere questo problema per modificare talune delle classi della gerarchia Animale per includere il comportamento di animale domestico.

Page 7: Interfaccia

Primo tentativo di soluzione

Mettiamo i metodi del comportamento domestico direttamente nella super classe Animale !

Vantaggi della soluzione: Tutti gli animali istantaneamente ereditano il

comportamento domestico. Non dobbiamo minimamente toccare le sottoclassi

esistenti Inoltre tutte le sottoclassi che saranno create

automaticamente erediteranno il comportamento di animali domestici.

La classe Animale potrà essere usata come tipo polimorfico in ogni programma che vorrà trattare gli animali come domestici (Pet)

Page 8: Interfaccia

Svantaggi della soluzione di inserire i nuovi metodi nella superclasse

Ummm… Quando è stata l’ultima

volta che avete visto un ippopotamo in un negozio di animali domestici ?

Un leone ? Una volpe ? Potrebbe essere dannoso

attribuire metodi domestici ad animali selvaggi !

Inoltre dovremo certamente sovrascrivere i metodi per le classi Cane e Gatto perché questi oggetti tendono a implementare comportamenti domestici in modi molto diversi

Page 9: Interfaccia

Secondo tentativo di soluzione

Mettiamo tutti i metodi nella superclasse, ma li rendiamo tutti astratti !

Così forziamo tutte le sottoclassi concrete a riscriverli

Page 10: Interfaccia

Vantaggi dell’avere i metodi astratti

Abbiamo tutti i benefici della prima soluzioneInoltre non abbiamo gli animali selvaggi che si

aggirano nei dintorni con metodi domestici come beFriendly().

Tutte le classi di animali avranno i metodi domestici, ma poiché è astratto gli animali selvaggi non erediteranno nessuna funzionalità.

Tutti dovranno ridefinire questi metodi, ma le classi di animali selvaggi semplicemente non gli faranno fare nulla : befriendly() { }

Page 11: Interfaccia

Svantaggi dell’uso dei metodi astratti

Poiché tutti i metodi domestici della classe Animale sono astratti, le classi concrete sono forzate a sovrascriverli ( i metodi astratti devono essere implementati dalle prime sottoclassi concrete nella linea di discendenza)

Che perdita di tempo ! Vi dovete sedere e digitare ciascun metodo in ciascuna classe di animali non domestici e pure in tutte le future sottoclassi.

Inoltre il contratto è sbagliato Ogni animale selvaggio si presenterà al mondo con

questi metodi domestici anche se non fanno nulla.

Page 12: Interfaccia

Terza soluzione. Mettiamo i metodi domestici solo nelle classi degli animali domestici.

Page 13: Interfaccia

Vantaggi

Non c’è più da preoccuparsi per l’ippopotamo che vi lecca la faccia, che fa le fusa alla porta di casa !

I metodi domestici saranno scritti solo laddove necessitano

Ma…

Page 14: Interfaccia

Svantaggi

Anzitutto bisogna accordarsi su di un protocolloPer protocollo si intende la definizione esatta di tutti i

metodi che abbiamo deciso devono avere tutti gli animali domestici.

Tutti i programmatori delle classi degli animali devono sapere ora e nel futuro quali sono i metodi di questo protocollo. Ma come fanno ?

Inoltre che succede se un programmatore commette anche un piccolo errore ? Ad esempio chiamare un metodo doFriendly() invece che

beFriendly() ? Restituire una String in un metodo anziché l’int ? Il compilatore non ha nessuna possibilità di verificare che abbiate

implementato i metodi correttamente, perché questi non sono in un contratto.

Qualche altro programmatore potrebbe usare queste classi e scoprire che non tutte funzionano correttamente.

Page 15: Interfaccia

Che cosa vogliamo veramente

Un modo per avere il comportamento di animali domestici solo nella classi di animali domestici

Un modo per garantire che tutte le classi Pet abbiano tutte i medesimi metodi definiti ( con lo stesso nome, i medesimi parametri di input, i medesimi tipi di dati restituiti…) senza dover incrociare le dita e sperare che tutti i programmatori non commettano nessun errore.

Un modo per poter trarre vantaggio dal polimorfismo

Page 16: Interfaccia

Dovremmo avere due superclassi !

Page 17: Interfaccia

Svantaggio della ereditarietà multipla

Con l’approccio di due superclassi c’è un problema

Page 18: Interfaccia

Soluzione: interfaccia !!

Non un’interfaccia graficaMa la keyword interfaceL’interfaccia java risolve il problema della

ereditarietà multiplaUn’interfaccia è fatta solo da metodi astratti

Page 19: Interfaccia

Le sottoclassi devono implementare l’interfaccia

Page 20: Interfaccia

implementazione

Page 21: Interfaccia

Quando fare una classe, una superclasse, una classe astratta, o

un’interfaccia

Fai una classe che non estende nessun’altra classe quando la nuova classe non supera il test is-a per nessun altro tipo

Fai una sottoclasse, solo quando necessita una più specifica versione di una classe esistente per sovrascrivere o aggiungere un nuovo comportamento

Una una classe astratta quando si vuole definire uno stampino per un gruppo di classi e si ha del codice implementato che tutte le sottoclassi debbano usare.

Fai un’interfaccia quando si vuole definire un ruolo che le altre classi possano giocare, indipendentemente da quale linea di ereditarietà si trovino