Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Interfaccia

1,343 views

Published on

definire una interfaccia per dare un protocollo

  • Be the first to comment

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>

×