Interfaccia

1,186 views
1,112 views

Published on

definire una interfaccia per dare un protocollo

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,186
On SlideShare
0
From Embeds
0
Number of Embeds
70
Actions
Shares
0
Downloads
29
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Interfaccia

  1. 1. LEZIONE DEL PROF. SILVANO NATALIZI DI NOVEMBRE 2008 PER LA CLASSE IV A LICEO TECNICO Interfaccia Java
  2. 2. I metodi della classe sono un contratto <ul><li>Quando scrivete una classe, quasi sempre esponete alcuni dei suoi metodi a del codice esterno alla classe. </li></ul><ul><li>Per rendere disponibile un metodo, dovete renderlo accessibile, di solito facendolo pubblico (public) </li></ul>
  3. 3. Quali sono tutti i metodi di una classe che definiscono il suo contratto ? <ul><li>Prendiamo la classe Cane. I suoi metodi definiscono l’essere cane. Essi sono il suo contratto. </li></ul><ul><li>Ma non sono tutto il suo essere </li></ul><ul><li>Infatti Cane eredita i metodi pubblici di tutte le sue superclassi ! </li></ul><ul><li>Ogni cosa della classe Canina fa parte del suo contratto </li></ul><ul><li>Ogni cosa della classe Animale fa parte del suo contratto </li></ul><ul><li>Ogni cosa della classe Object fa parte del suo contratto </li></ul>
  4. 4. Cosa succede se dobbiamo modificare il contratto di una classe? <ul><li>Se volete usare il programma di simulazione degli animali per farne uno di animali domestici ? </li></ul><ul><li>Non si può perché nella classe Cane non è stato ancora inserito il comportamento di animale domestico (Pet) </li></ul><ul><li>Ad esempio mancano i metodi beFriendly(), play(). </li></ul>
  5. 5. Come si introduce il nuovo comportamento ? <ul><li>No problem: basta aggiungere i nuovi metodi beFriendly() e play() alla classe Cane ! </li></ul><ul><li>Così facendo non si interferisce con il codice di altre classi perché non si tocca il codice esistente che qualcun altro potrebbe stare utilizzando. </li></ul><ul><li>Ma… </li></ul>
  6. 6. C’è qualche problema con l’inserire i metodi Pet direttamente nella classe Cane ? <ul><li>Quello che si vuole realizzare è un PetShop programma. Non ci sono solo i Cani ! </li></ul><ul><li>Che cosa succede se qualcuno volesse usare la classe Cane per fare un programma nel quale ci siano cani selvaggi (wild dogs)? </li></ul><ul><li>Cerca di immaginare come si può risolvere questo problema per modificare talune delle classi della gerarchia Animale per includere il comportamento di animale domestico. </li></ul>
  7. 7. Primo tentativo di soluzione <ul><li>Mettiamo i metodi del comportamento domestico direttamente nella super classe Animale ! </li></ul><ul><li>Vantaggi della soluzione: </li></ul><ul><ul><li>Tutti gli animali istantaneamente ereditano il comportamento domestico. </li></ul></ul><ul><ul><li>Non dobbiamo minimamente toccare le sottoclassi esistenti </li></ul></ul><ul><ul><li>Inoltre tutte le sottoclassi che saranno create automaticamente erediteranno il comportamento di animali domestici. </li></ul></ul><ul><ul><li>La classe Animale potrà essere usata come tipo polimorfico in ogni programma che vorrà trattare gli animali come domestici (Pet) </li></ul></ul>
  8. 8. Svantaggi della soluzione di inserire i nuovi metodi nella superclasse <ul><li>Ummm… </li></ul><ul><li>Quando è stata l’ultima volta che avete visto un ippopotamo in un negozio di animali domestici ? </li></ul><ul><li>Un leone ? Una volpe ? </li></ul><ul><li>Potrebbe essere dannoso attribuire metodi domestici ad animali selvaggi ! </li></ul><ul><li>Inoltre dovremo certamente sovrascrivere i metodi per le classi Cane e Gatto perché questi oggetti tendono a implementare comportamenti domestici in modi molto diversi </li></ul>
  9. 9. Secondo tentativo di soluzione <ul><li>Mettiamo tutti i metodi nella superclasse, ma li rendiamo tutti astratti ! </li></ul><ul><li>Così forziamo tutte le sottoclassi concrete a riscriverli </li></ul>
  10. 10. Vantaggi dell’avere i metodi astratti <ul><li>Abbiamo tutti i benefici della prima soluzione </li></ul><ul><li>Inoltre non abbiamo gli animali selvaggi che si aggirano nei dintorni con metodi domestici come beFriendly(). </li></ul><ul><li>Tutte le classi di animali avranno i metodi domestici, ma poiché è astratto gli animali selvaggi non erediteranno nessuna funzionalità. </li></ul><ul><li>Tutti dovranno ridefinire questi metodi, ma le classi di animali selvaggi semplicemente non gli faranno fare nulla : befriendly() { } </li></ul>
  11. 11. Svantaggi dell’uso dei metodi astratti <ul><li>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) </li></ul><ul><li>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. </li></ul><ul><li>Inoltre il contratto è sbagliato </li></ul><ul><ul><li>Ogni animale selvaggio si presenterà al mondo con questi metodi domestici anche se non fanno nulla. </li></ul></ul>
  12. 12. Terza soluzione. Mettiamo i metodi domestici solo nelle classi degli animali domestici.
  13. 13. Vantaggi <ul><li>Non c’è più da preoccuparsi per l’ippopotamo che vi lecca la faccia, che fa le fusa alla porta di casa ! </li></ul><ul><li>I metodi domestici saranno scritti solo laddove necessitano </li></ul><ul><li>Ma… </li></ul>
  14. 14. Svantaggi <ul><li>Anzitutto bisogna accordarsi su di un protocollo </li></ul><ul><li>Per protocollo si intende la definizione esatta di tutti i metodi che abbiamo deciso devono avere tutti gli animali domestici. </li></ul><ul><li>Tutti i programmatori delle classi degli animali devono sapere ora e nel futuro quali sono i metodi di questo protocollo. Ma come fanno ? </li></ul><ul><li>Inoltre che succede se un programmatore commette anche un piccolo errore ? </li></ul><ul><ul><li>Ad esempio chiamare un metodo doFriendly() invece che beFriendly() ? </li></ul></ul><ul><ul><li>Restituire una String in un metodo anziché l’int ? </li></ul></ul><ul><ul><li>Il compilatore non ha nessuna possibilità di verificare che abbiate implementato i metodi correttamente, perché questi non sono in un contratto. </li></ul></ul><ul><ul><li>Qualche altro programmatore potrebbe usare queste classi e scoprire che non tutte funzionano correttamente. </li></ul></ul>
  15. 15. Che cosa vogliamo veramente <ul><li>Un modo per avere il comportamento di animali domestici solo nella classi di animali domestici </li></ul><ul><li>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. </li></ul><ul><li>Un modo per poter trarre vantaggio dal polimorfismo </li></ul>
  16. 16. Dovremmo avere due superclassi !
  17. 17. Svantaggio della ereditarietà multipla <ul><li>Con l’approccio di due superclassi c’è un problema </li></ul>
  18. 18. Soluzione: interfaccia !! <ul><li>Non un’interfaccia grafica </li></ul><ul><li>Ma la keyword interface </li></ul><ul><li>L’interfaccia java risolve il problema della ereditarietà multipla </li></ul><ul><li>Un’interfaccia è fatta solo da metodi astratti </li></ul>
  19. 19. Le sottoclassi devono implementare l’interfaccia
  20. 20. implementazione
  21. 21. Quando fare una classe, una superclasse, una classe astratta, o un’interfaccia <ul><li>Fai una classe che non estende nessun’altra classe quando la nuova classe non supera il test is-a per nessun altro tipo </li></ul><ul><li>Fai una sottoclasse, solo quando necessita una più specifica versione di una classe esistente per sovrascrivere o aggiungere un nuovo comportamento </li></ul><ul><li>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. </li></ul><ul><li>Fai un’interfaccia quando si vuole definire un ruolo che le altre classi possano giocare, indipendentemente da quale linea di ereditarietà si trovino </li></ul>

×