Presentazione primi principi oop

8,674 views

Published on

Presentazione principi oop: incapsulamento, information hiding e overloading

Published in: Education, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,674
On SlideShare
0
From Embeds
0
Number of Embeds
6,623
Actions
Shares
0
Downloads
104
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Presentazione primi principi oop

  1. 1. Primi principi della OOP Incapsulamento, information hiding, overloading
  2. 2. Origini e sviluppo OOP <ul><li>Nasce come risposta a tutti i problemi legati alla produzione di programmi complessi che le tecniche di progettazione tradizionale di tipo procedurale non avevano risolto </li></ul><ul><li>Punti distintivi: </li></ul><ul><li>Considerare modelli di dati e algoritmi simultaneamente e non più in modo separato </li></ul><ul><li>Consentire il riutilizzo di software già sviluppato nelle nuove applicazioni </li></ul><ul><li>Descrive la realtà mediante modelli di dati “vicini” al modo naturale di pensare dell’uomo </li></ul>
  3. 3. Evoluzione <ul><li>Anni ‘60: </li></ul><ul><li>Con i primi studi sull’intelligenza artificiale compare il principio che l’uomo sviluppa il proprio pensiero logico utilizzando oggetti </li></ul><ul><li>Anni ‘70: </li></ul><ul><li>Alan Kay crea il primo linguaggio object oriented, Smalltalk, che sviluppa a livello di codifica il concetto di oggetto </li></ul><ul><li>Anni ’80 </li></ul><ul><li>Le nuove tecniche si diffondono con C++ e con Visual Basic </li></ul><ul><li>Anni ‘90: </li></ul><ul><li>Java </li></ul>
  4. 4. Applicazioni OOP <ul><li>Attualmente le tecniche OO sono molto diffuse nelle seguenti applicazioni: </li></ul><ul><li>Gestione di basi di dati </li></ul><ul><li>Gestione di interfacce grafiche </li></ul><ul><li>Sistemi multimediali (gestione di immagini, testi, animazioni, suoni e video) </li></ul><ul><li>Applicazioni per reti di calcolatori </li></ul>
  5. 5. Progettazione procedurale e OO <ul><li>Il progetto si presenta come un insieme di classi di oggetti che incapsulano al loro interno sia i modelli dei dati che le operazioni (metodi). </li></ul>Il progetto è formato dal modello dei dati e dall’algoritmo risolutivo
  6. 6. Classe di oggetti <ul><li>Nella programmazione OO, una applicazione è composta da un insieme di CLASSI che rappresentano OGGETTI del mondo reale che interagiscono tra di loro. </li></ul><ul><li>Una classe è una astrazione (idea astratta o modello ) che definisce un insieme di OGGETTI di uno stesso tipo , ovvero una famiglia di oggetti aventi caratteristiche e comportamenti simili </li></ul><ul><li>la classe è costituita da attributi e metodi </li></ul><ul><li>gli attributi indicano le caratteristiche o proprietà che distinguono ogni esemplare della classe </li></ul><ul><li>I metodi sono le funzionalità dell’oggetto, cioè i comandi che possono essere impartiti ad ogni esemplare della classe </li></ul>
  7. 7. Classi, attributi e metodi <ul><li>Classe : Automobile (entità astratta, modello generico di automobile); ogni automobile è caratterizzata da un colore, da una marca, da un modello, da una cilindrata,.....: sono gli attributi della classe </li></ul><ul><li>ogni automobile può avviarsi, fermarsi, sterzare, accelerare, etc... : sono i metodi della classe </li></ul>
  8. 8. Oggetto o istanza <ul><li>“ la mia auto ” , &quot; la tua auto &quot;, &quot; l'auto del presidente &quot;, sono esemplari della classe Automobile </li></ul><ul><li>presentano tutte le medesime proprietà e i medesimi comportamenti: hanno un colore, un modello, una marca, una cilindrata, si avviano, si fermano, sterzano, accelerano, ecc.... </li></ul><ul><li>si dice che la classe è il modello ( blueprint ), lo stampino degli oggetti. </li></ul><ul><li>un'istanza (o oggetto) di una classe corrisponde ad un esemplare reale, fabbricato da quel modello (da quello stampino) </li></ul><ul><li>ogni istanza della classe ha caratteristiche e comportamenti comuni, ma si differenzia per i valori assunti dalle sue proprietà. Tutte le automobili hanno una marca, un modello, un colore, una cilindrata e possono avviarsi, frenare, sterzare, ecc.., ma la cilindrata, il colore, la marca e il modello variano da oggetto ad oggetto </li></ul><ul><li>In ogni istanza le proprietà assumono valori . </li></ul>
  9. 9. Esempio <ul><li>Classe Automobile Proprietà </li></ul><ul><ul><li>marca modello colore alimentazione numero porte cilindrata targa ……….. </li></ul></ul><ul><li>Metodi </li></ul><ul><ul><li>avviati accelera cambia (numero marcia) frena fermati sterza (direzione) ……. </li></ul></ul><ul><li>Istanza1 </li></ul><ul><li>miaAuto </li></ul><ul><li>Proprietà </li></ul><ul><ul><li>marca=&quot;Fiat&quot; modello=&quot;Punto&quot; colore=&quot;verde&quot; alimentazione=&quot;benzina&quot; numero porte=5 cilindrata=1300 targa=&quot;.....&quot; </li></ul></ul><ul><li>Istanza2 </li></ul><ul><li>tuaAuto </li></ul><ul><li>Proprietà </li></ul><ul><ul><li>marca=&quot;Opel&quot; modello=&quot;Astra&quot; colore=&quot;rosso&quot; alimentazione=&quot;diesel&quot; numero porte=5 cilindrata=1800 targa=&quot;.....&quot; </li></ul></ul>
  10. 10. Test <ul><li>Fido e Pluto sono cani. Quale è l’oggetto e quale è la classe? Perché? </li></ul><ul><li>Risposta </li></ul><ul><li>Fido e Pluto sono oggetti (o istanze) della classe Cane; hanno stato diverso (ad esempio nome diverso, età diversa, colore diverso, razza diversa) e comportamento uguale (stessi metodi: corre, abbaia, salta, azzanna, mangia). </li></ul>
  11. 11. Metodi, attributi e stato <ul><li>Classe Quadrato </li></ul><ul><li>un quadrato è caratterizzato da un lato; del quadrato possiamo calcolare l'area e il perimetro </li></ul><ul><li>Proprietà / Attributi </li></ul><ul><li>lato </li></ul><ul><li>Comportamento / Metodi </li></ul><ul><li>calcolaArea </li></ul><ul><li>calcolaPerimetro </li></ul><ul><li>Istanza / Oggetto </li></ul><ul><li>alla classe Quadrato appartengono oggetti concreti che si differenziano per la misura del lato. </li></ul>
  12. 12. Attività di lettura <ul><li>Considera il seguente testo in linguaggio naturale </li></ul><ul><li>Red e Toby sono animali. Entrambi mangiano quando hanno fame, si muovono e fanno versi. Red ha il mantello rosso e ha 3 anni ; Toby ha il mantello grigio e ha 4 anni. </li></ul><ul><li>Individuare classi, oggetti, metodi , attributi e stato </li></ul>
  13. 13. Linguaggio naturale Equivalente Object Oriented Risposta corretta Nomi concreti Oggetti (entità del dominio) Red, Toby Nomi astratti Classi (generalizzazione di oggetti di uno stesso tipo) Animale Verbi Metodi o funzioni membro si muove, ha fame, mangia, fa versi Proprietà Attributi nome, colore, età Valori delle proprietà Stato nome=Red colore=rosso età=3 nome=Toby colore=grigio età=4  
  14. 14. Creazione di istanze e costruttori <ul><li>La creazione di un oggetto (o esemplare) a partire da una classe è chiamata istanziazione o creazione di un' istanza della classe.  </li></ul><ul><li>Gli oggetti sono creati per mezzo di metodi speciali chiamati costruttori. </li></ul><ul><li>Il costruttore ha lo stesso nome della classe e non ritorna niente. </li></ul><ul><li>Possono esserci più costruttori per una classe a patto che prendano parametri diversi </li></ul><ul><li>Se non viene dichiarato nessun costruttore ne viene creato automaticamente uno che inizializza tutti i campi con valori di default e non riceve argomenti. Si chiama costruttore di default   </li></ul><ul><li>L'oggetto può essere creato all'interno di un'altra classe oppure del main. </li></ul>
  15. 15. Operatore new <ul><li>In Java si distingue tra la dichiarazione di una istanza e la sua vera e propria creazione, che avviene per mezzo di un operatore che si chiama new che alloca in memoria un nuovo oggetto del tipo richiesto </li></ul><ul><li>Per esempio se in Java devo creare un'istanza della classe Automobile scriverò: </li></ul><ul><li>Automobile miaAuto; // dichiarazione: miaAuto identifica un esemplare di Automobile </li></ul><ul><li>miaAuto=new Automobile(); // creazione: con l'operatore new creo un nuovo esemplare di automobile e lo associo a miaAuto </li></ul><ul><li>miaAuto è il riferimento (puntatore o reference) all'oggetto di classe Automobile istanziato. </li></ul>
  16. 16. Riferimento <ul><li>Dopo aver creato un oggetto si possono usare o modificare i suoi attributi o eseguire delle operazioni richiamando i suoi metodi. </li></ul><ul><li>Per fare riferimento agli attributi di un oggetto si utilizzerà la seguente sintassi, basata sulla notazione puntata (dot notation): </li></ul><ul><li>miaAutomobile.colore indica il colore della mia automobile Per assegnare un valore all'attributo colore (o per modificarlo) scrivo miaAutomobile.colore=&quot;verde&quot;; N.B.: in Java miaAutomobile è una variabile riferimento ad un oggetto di classe Automobile, non è l'oggetto stesso! Per far eseguire un'azione all'oggetto utilizzerò ancora la notazione puntata richiamando uno dei metodi nel seguente modo: </li></ul><ul><li>miaAutomobile.avviati() per avviare l’auto </li></ul><ul><li>miaAutomobile.cambia(4) per inserire la quarta </li></ul><ul><li>Generalizzando, scriverò: </li></ul><ul><li>riferimentoOggetto.attributo </li></ul><ul><li>riferimentoOggetto.metodo() </li></ul>
  17. 17. Esempio: classe Auto <ul><li>class Auto { // nome classe </li></ul><ul><ul><li>String marca; //definizione attributi </li></ul></ul><ul><ul><li>String modello; </li></ul></ul><ul><ul><li>int cil; </li></ul></ul><ul><ul><li>int carburante; </li></ul></ul><ul><li>Auto() { // definizione costruttore </li></ul><ul><ul><li>carburante=0; </li></ul></ul><ul><li>} </li></ul><ul><li>void avviati() { //definizione metodo avviati (non ha parametri né restituzione) </li></ul><ul><ul><li>System.out.println(&quot;mi sono avviata&quot;); </li></ul></ul><ul><li>} </li></ul><ul><li>void rifornimento(int carb) { // metodo rifornimento (con paremetro quantità di carburante) </li></ul><ul><ul><li>carburante=carburante+carb; </li></ul></ul><ul><li>} } </li></ul>
  18. 18. Creare istanze <ul><li>La seguente classe TestAuto crea un’istanza di auto e testa alcuni metodi </li></ul><ul><li>public class TestAuto { </li></ul><ul><ul><li>public static void main(String args[]){ </li></ul></ul><ul><ul><ul><li>Auto miaAuto; // dichiarazione riferimento ad Auto </li></ul></ul></ul><ul><ul><ul><li>miaAuto=new Auto (); //creazione istanza </li></ul></ul></ul><ul><ul><ul><li>miaAuto.marca=&quot;Fiat&quot;; // accede agli attributi utilizzando il riferimento </li></ul></ul></ul><ul><ul><ul><li>miaAuto.modello =&quot;Punto&quot;; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.cil=1100; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.rifornimento(40); //chiama il metodo rifornimento </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;marca &quot;+miaAuto.marca); //accede agli attributi per mostrare il valore </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;modello= &quot;+miaAuto.modello); </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;cilindrata= &quot;+miaAuto.cil); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.avviati(); //chiama il metodo avviati() </li></ul></ul></ul><ul><ul><li>} } </li></ul></ul>
  19. 19. Accedere agli attributi <ul><li>Nell’esempio appena visto chi scrive la classe TestAuto che utilizza la classe Auto, modifica il valore degli attributi scrivendo: </li></ul><ul><ul><ul><li>miaAuto.marca=&quot;Fiat&quot;; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.modello =&quot;Punto&quot;; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.cil=1100; </li></ul></ul></ul><ul><li>Questo non è un buon modo di programmare: è come se il programmatore “aprisse” l’oggetto auto e vi “mettesse le mani dentro” </li></ul><ul><li>Nella realtà chi utilizza un oggetto, “non lo apre” e può non conoscerne i dettagli implementativi </li></ul>
  20. 20. Incapsulamento <ul><li>L' incapsulamento è la proprietà per cui un oggetto contiene (&quot; incapsula &quot;) al suo interno gli attributi (dati) e i metodi (procedure) che accedono ai dati stessi. </li></ul><ul><li>i dati (attributi) di un oggetto possono essere manipolati solo attivando i suoi metodi </li></ul><ul><li>un metodo è attivato dall’oggetto a fronte di una specifica richiesta di servizio ( messaggio ) </li></ul><ul><li>solo l’interfaccia pubblica dell’oggetto, costituita dai servizi che l’oggetto può offrire, è nota all’esterno </li></ul><ul><li>si comunica con un oggetto inviandogli un messaggio in cui si specifica che cosa si vuole da esso </li></ul>
  21. 21. Visibilità <ul><li>Gli attributi e i metodi possono essere </li></ul><ul><ul><li>---> pubblici visibili/accessibili direttamente dall'esterno ----> costituiscono l' interfaccia pubblica dell'oggetto </li></ul></ul><ul><ul><li>---> privati non sono visibili/accessibili all'esterno ---> information hiding (occultamento delle informazioni) </li></ul></ul><ul><li>Ogni classe di ha due livelli, uno esterno (pubblico) ed uno interno (privato) </li></ul><ul><li>Livello esterno o interfaccia pubblica </li></ul><ul><li>Metodi e attributi visibili all’esterno, definisce i servizi che l’oggetto può fornire </li></ul><ul><li>Livello interno o privato </li></ul><ul><li>definisce le proprietà dell’oggetto (i dati) e le modalità di trattamento di questi dati (implementazione dei metodi) </li></ul>
  22. 22. Information hiding <ul><li>Nella programmazione orientata agli oggetti è buona regola occultare gli attributi (lo stato degli oggetti) rendendoli privati e dare accesso ai dati solo attraverso i metodi pubblici . L'occultamento prende il nome di Information hiding. </li></ul><ul><li>Information hiding e incapsulamento sono due concetti distinti, ma strettamente legati. </li></ul>
  23. 23. Modello dei dati incapsulato
  24. 24. Dichiarazione e implementazione di una classe <ul><li>La costruzione di una classe avviene in due fasi: </li></ul><ul><li>Dichiarazione o definizione della sua parte privata e pubblica (attributi e metodi) </li></ul><ul><li>Implementazione dei metodi </li></ul><ul><li>La visione di una classe è diversa per: </li></ul><ul><li>Progettisti , che vedono anche l’implementazione interna della classe </li></ul><ul><li>Utenti (altri progettisti e programmatori), che sono interessati solo all’interfaccia pubblica, con la dichiarazione delle intestazioni dei metodi </li></ul>
  25. 25. Vantaggi interfaccia pubblica <ul><li>Grazie all’interfaccia, gli utenti sono in grado di utilizzare gli oggetti di una classe per: </li></ul><ul><li>impostare e recuperare il valore degli attributi </li></ul><ul><li>richiamare i metodi </li></ul>
  26. 26. Visibilità della classe
  27. 27. Vantaggi incapsulamento <ul><li>L'incapsulamento nasconde i dettagli implementativi , impedisce di falsare lo stato dell'oggetto con dei valori non ammessi </li></ul><ul><li>I valori delle variabili possono essere cambiati solo dall’oggetto e non dall'esterno. </li></ul><ul><li>L’incapsulamento soddisfa le seguenti esigenze: </li></ul><ul><li>programmazione molto disciplinata, a vantaggio del riuso e della manutenzione </li></ul><ul><li>il bisogno di modularità </li></ul><ul><li>la necessità di distinguere nettamente tra definizione e implementazione di un servizio (metodo) </li></ul>
  28. 28. Classe incapsulata <ul><li>Classe incapsulata = attributi privati + metodi pubblici </li></ul><ul><li>I vantaggi principali portati dall'incapsulamento sono: robustezza , indipendenza e l'estrema riusabilità degli oggetti creati. Inoltre la sua manutenzione risulterà più semplice al programmatore. </li></ul>
  29. 29. Esempio <ul><li>Se non dichiaro privato l'attributo 'nome' della classe Animale, il suo contenuto può essere cambiato facilmente senza nessun controllo. </li></ul><ul><li>Animale fido = new Animale(“Fido”); </li></ul><ul><li>fido.nome = “Ralph&quot;; // ma non era Fido?? </li></ul><ul><li>Questa è una violazione dell'incapsulamento. Non abbiamo adeguatamente nascosto la variabile nome da modifiche arbitrarie </li></ul>
  30. 30. La black box <ul><li>L’incapsulamento permette di vedere l'oggetto come una black-box , cioè una scatola nera della quale conosciamo l'interfaccia e sappiamo cosa fa, ma non come lo fa. All'interno della scatola nera sono occultati tutti i suoi meccanismi segreti. </li></ul><ul><li>Ciò è quello che avviene anche nella realtà. Si pensi ad oggetti comuni quali videogame, computer e automobile: noi non vediamo cosa c'è al loro interno, ma possiamo utilizzarli e interagire con essi. </li></ul><ul><li>Per es. noi utilizziamo e guidiamo l'oggetto auto senza sapere come essa è fatta al suo interno, ma agendo su di essa attraverso leve, pulsanti, pedali, pulsanti che costituiscono l'interfaccia tra l'oggetto e noi e che ci consentono di attivare tutte le sue funzionalità. Allo stesso modo richiamiamo le diverse funzioni del nostro computer col mouse attraverso un'interfaccia grafica. </li></ul>
  31. 31. Il videogame Noi usiamo il videogame schiacciando dei pulsanti che attivano funzioni: conosciamo e utilizziamo solo la sua interfaccia pubblica
  32. 32. Il telefono <ul><li>Se volessimo fare un altro esempio potremmo prendere in considerazione un telefono . </li></ul><ul><li>La maggior parte degli utenti, infatti, sa utilizzare il telefono, ma ne ignora il funzionamento interno. </li></ul><ul><li>Chiunque può alzare la cornetta, comporre un numero telefonico e conversare con un'altra persona, ma pochi conoscono in dettaglio la sequenza dei processi scatenati da queste poche, semplici azioni. </li></ul><ul><li>Evidentemente, per utilizzare il telefono, non è necessario prendere una laurea in telecomunicazioni: basta conoscere la sua interfaccia pubblica (costituita dalla cornetta e dai tasti), non la sua implementazione interna. </li></ul>
  33. 33. Conto Corrente Bancario <ul><li>Per fare un altro esempio pensiamo ad un conto bancario . </li></ul><ul><li>Le informazioni utili (le proprietà) potranno essere rappresentate da: numero di conto, saldo, nome del cliente, indirizzo, tipo di conto, tasso di interesse e data di apertura. </li></ul><ul><li>Le azioni che operano su tali informazioni (i metodi) saranno, invece: apertura, chiusura, versamento, prelevamento, cambio tipologia conto, cambio cliente e cambio indirizzo. L'oggetto Conto incapsulerà queste informazioni e azioni al suo interno. Noi possiamo modificare lo stato del conto (il saldo, per es.) attraverso l'operazione (metodo) di prelevamento o di versamento, e tutto questo senza accedere mai direttamente alla cassaforte della banca. </li></ul><ul><li>Allo stesso modo è possibile interagire con l'oggetto attraverso la sua interfaccia pubblica, costituita da metodi pubblici. </li></ul>
  34. 34. Implementazione e segnatura <ul><li>L'implementazione dei metodi, ovvero il loro codice, è sempre nascosta; può essere visibile solo l'interfaccia, ovvero la firma o segnatura (la definizione). </li></ul><ul><li>Allo stesso modo quando avviamo l'automobile dobbiamo solo sapere quale chiave girare, ma tutto ciò che accade dopo non lo vediamo e possiamo guidare l'auto anche ignorandolo! </li></ul>
  35. 35. Implementazione dell’incapsulamento <ul><li>Come già detto, a livello di implementazione, si ottiene l'incapsulamento semplicemente dichiarando privati gli attributi di una classe e quindi inaccessibili fuori dalla classe stessa. A tale scopo Java introduce il modificatore di metodo private . </li></ul><ul><li>L'accesso ai dati potrà essere fornito da un'interfaccia pubblica costituita da metodi dichiarati public e quindi accessibili da altre classi. </li></ul><ul><li>Se l'incapsulamento è gestito in maniera intelligente, le nostre classi potranno essere utilizzate nel modo migliore e più a lungo, giacché le modifiche e le revisioni potranno riguardare solamente parti di codice non visibili all'esterno. </li></ul>
  36. 36. Definizione di classe senza rispettare il principio dell'incapsulamento Classe Auto (senza rispettare il principio dell’incapsulamento) Classe TestAuto <ul><li>class Auto { </li></ul><ul><ul><li>public String marca; </li></ul></ul><ul><ul><li>public String modello; </li></ul></ul><ul><ul><li>public int cil; </li></ul></ul><ul><ul><li>private int carburante; </li></ul></ul><ul><li>public Auto() { </li></ul><ul><ul><li>carburante=0; </li></ul></ul><ul><li>} </li></ul><ul><li>public void avviati () { </li></ul><ul><ul><li>System.out.println(&quot;mi sono avviata&quot;); </li></ul></ul><ul><li>} </li></ul><ul><li>public void rifornimento(int Carb) </li></ul><ul><li>{ </li></ul><ul><ul><li>Carburante=carburante+Carb; </li></ul></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>public class Test { </li></ul><ul><ul><li>public static void main(String args[]){ </li></ul></ul><ul><ul><ul><li>Auto miaAuto; </li></ul></ul></ul><ul><ul><ul><li>miaAuto=new Auto (); // accesso diretto agli attributi </li></ul></ul></ul><ul><ul><ul><li>miaAuto.marca=&quot;Fiat&quot;; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.modello =&quot;Punto&quot;; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.cil=1100; </li></ul></ul></ul><ul><ul><ul><li>miaAuto.rifornimento(40); </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;marca &quot;+miaAuto.marca); </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;modello= &quot;+miaAuto.modello); </li></ul></ul></ul><ul><ul><ul><li>System.out.println(&quot;cilindrata= &quot;+miaAuto.cil); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.avviati(); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  37. 37. Definizione di classe rispettando il principio dell'incapsulamento Classe Auto incapsulata Classe TestAuto <ul><li>class Auto { </li></ul><ul><ul><li>private String marca; </li></ul></ul><ul><ul><li>private String modello; </li></ul></ul><ul><ul><li>private int cil; </li></ul></ul><ul><ul><li>private int carburante; </li></ul></ul><ul><li>public Auto() { // costruttore </li></ul><ul><ul><li>carburante=0; </li></ul></ul><ul><li>} </li></ul><ul><li>public void avviati () { </li></ul><ul><ul><li>System.out.println(&quot;mi sono avviata&quot;); </li></ul></ul><ul><li>} </li></ul><ul><li>public void rifornimento(int Carb) </li></ul><ul><li>{ </li></ul><ul><ul><li>carburante=carburante+Carb; </li></ul></ul><ul><li>} </li></ul><ul><li>//metodi per l'accesso agli attributi privati </li></ul><ul><li>public void setMarca (String m){ </li></ul><ul><ul><li>marca=m; </li></ul></ul><ul><li>} </li></ul><ul><li>public void setModello (String m){ </li></ul><ul><ul><li>modello=m; </li></ul></ul><ul><li>} </li></ul><ul><li>public void setCilindrata (int c){ </li></ul><ul><ul><li>cil=c; </li></ul></ul><ul><li>} </li></ul><ul><li>public void mostraStato (){ </li></ul><ul><ul><li>System.out.println(&quot;marca &quot;+marca); System.out.println(&quot;modello= &quot;+modello); System.out.println(&quot;cilindrata= &quot;+cil); System.out.println(“carburante= &quot;+carburante); </li></ul></ul><ul><li>} } </li></ul><ul><li>public class Test { </li></ul><ul><ul><li>public static void main(String args[]){ </li></ul></ul><ul><ul><ul><li>Auto miaAuto; // dichiarazione </li></ul></ul></ul><ul><ul><ul><li>//creazione auto </li></ul></ul></ul><ul><ul><ul><li>miaAuto=new Auto(); </li></ul></ul></ul><ul><ul><ul><li>// accesso diretto agli attributi </li></ul></ul></ul><ul><ul><ul><li>miaAuto.setMarca(&quot;Fiat&quot;); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.setModello(&quot;Punto&quot;); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.setCilindrata(1100); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.rifornimento(40); </li></ul></ul></ul><ul><ul><ul><li>miaAuto.mostraDati(); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  38. 38. Overloading <ul><li>Consente di avere più metodi con definizione e implementazione diversa, ma con lo stesso nome </li></ul><ul><li>Esempio: </li></ul><ul><li>Immaginiamo di avere una classe Cane e una classe Gatto. Nella classe Cane possiamo definire i metodi </li></ul><ul><ul><ul><li>void insegue (Cane c) </li></ul></ul></ul><ul><li>oppure </li></ul><ul><ul><ul><li>void insegue (Gatto g) </li></ul></ul></ul><ul><li>I due metodi hanno stesso nome, ma diversa segnatura (cambia il tipo del parametri) e implementano due comportamenti diversi dello stesso animale </li></ul>
  39. 39. L’operatore “+” <ul><li>Pensiamo ad un operatore aritmetico che ci è molto familiare: il “+”, ovvero l’operatore di somma. </li></ul><ul><li>la somma può essere fatta su tipi diversi, numeri interi, numeri in virgola mobile e perfino stringhe (in questo caso avremo la concatenazione) </li></ul><ul><li>si tratta di operazioni diverse, su domini diversi, che presentano però notevole similitudine concettuale in quello che fanno, per cui noi le indichiamo con lo stesso nome </li></ul><ul><li>In realtà l'uomo è abituato a pensare per similitudini, per cui l'overloading degli operatori, si rivelano un utile meccanismo. </li></ul>
  40. 40. L’istruzione println <ul><li>Un altro esempio di overload riguarda il metodo che in Java prende il nome di println() (ma ci sono istruzioni analoghe in tutti i linguaggi) </li></ul><ul><li>Esistono almeno una decina di metodi println() diversi. </li></ul><ul><li>È possibile passare al metodo non solo stringhe, ma anche interi, boolean, array di caratteri o addirittura Object. </li></ul><ul><li>Anche in questo caso si tratta di metodi diversi con stesso nome e notevoli analogie. Il loro uso ci viene naturale e non ci piacerebbe certo se il linguaggio di programmazione a nostra disposizione ci costringesse ad utilizzare per fare operazioni simili molteplici metodi diversi come, per esempio: </li></ul><ul><ul><li>printIntero() per stampare interi </li></ul></ul><ul><ul><li>printReale() per visualizzare numeri reali </li></ul></ul><ul><ul><li>printString() per visualizzare dati di tipo String </li></ul></ul>
  41. 41. Esempio di implementazione di overloading <ul><li>public class Matematica{ </li></ul><ul><li>………………… . </li></ul><ul><ul><li>public int somma(int a, int b) { // somma interi e restituisce un intero </li></ul></ul><ul><ul><li>return a + b; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public float somma(float a, float b) { // somma reali e restituisce un relae </li></ul></ul><ul><ul><li>return a + b; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>…………………………………… </li></ul></ul><ul><li>} </li></ul><ul><li>Quale metodo sarà utilizzato? </li></ul><ul><li>Dipende dal tipo di parametri che verranno passati al momento della chiamata </li></ul>

×