Title: Overloading
1Overloading
- Differenze nei vari linguaggi
- di
- Elisa Trifirò e Barbara Tacchino
2Argomenti trattati
- Overloading un tipo di Polimorfismo
- Overloading in Java
- Overloading in C
- Overloading in C
- Conclusioni
3 Classificazione di Cardelli-Wegner
- La classificazione più completa risale al 1985 ed
è opera di Luca Cardelli e Peter Wegner
4Polimorfismo universale
- Sono quelle funzioni che possono operare su più
tipi purché vengano rispettate alcune proprietà. - Polimorfismo parametrico programmazione
generica. - Polimorfismo per inclusione programmazione ad
oggetti.
5Polimorfismo parametrico
- Idea utilizzare un tipo come parametro in una
funzione generica. - E il compilatore che genera di volta in volta
limplementazione corretta. - Esempio template in C
6Polimorfismo per inclusione
- Nell'approccio object-oriented si definisce la
classe degli elementi su cui ha senso applicare
una certa funzione. - Tutte le classi da essa derivate ne erediteranno
le funzioni, con la possibilità di ridefinirle.
7Polimorfismo ad-hoc
- Nel polimorfismo ad-hoc rientrano
- Overloading
- Coercion
8Coercion
- Coercion quando un valore di un tipo viene visto
(e talvolta trasformato) come valore di un altro
tipo. - Esempio nel sommare un float e un double,
avviene una promozione da float a double.
9Overloading
- Il termine overloading (da to overload) significa
sovraccaricamento e overloading delle funzioni
indica la possibilità di attribuire allo stesso
nome di funzione più significati. - Esempio
- int x 7 5
- double y 3.1 7.4
10Overloading in Java
- In Java é ammesso loverloading nel senso che é
possibile definire più versioni di un metodo o
costruttore che differiscono per la lista degli
argomenti.
11Esempio
- class MyComplex
- double a
- double b
- double m (MyComplex p)return p.a
- double m(double h)return this.ah
-
- Nota non possono differire per il tipo di
ritorno.
12Esempio
- In Java non é ammesso loverloading di operatori.
- class MyComplex
- double a,b
- public MyComplex add(MyComplex m)
- this.am.a
- this.bm.b
- return new MyComplex(this.a,this.b)
13Risoluzione delloverloading in Java
- La risoluzione delloverloading é la scelta della
versione da applicare ad ogni chiamata di metodo. - In Java é fatta staticamente ossia al momento
della compilazione.
14Algoritmo di risoluzione delloverloading in Java
- Lalgoritmo di risoluzione é il seguente
- Si cercano tutte le versioni del metodo che
potrebbero essere applicate, cioè con il nome
giusto e con i tipi (statici) - Se si trovano più versioni applicabili, si
elimina via via ogni versione meno specifica di
unaltra - Se alla fine si arriva ad una sola versione, è
quella da applicare, altrimenti si ha un errore
statico
15Considerazioni sulla risoluzione delloverloading
in Java
- La risoluzione delloverloading in Java
corrisponde ad un preprocessing che sostituisce
al nome del metodo un nome esteso con le
opportune informazioni di tipo.
16Un esempio errato
- public class B public void unMetodo()
System.out.println(Glup!) -
- public int unMetodo() System.out.println(Glup!
) return 1 -
- Questa classe dà errore in compilazione perché
non vi possono essere due metodi con lo stesso
nome e stessi parametri anche se con tipi di
ritorno differenti.
17Dynamic binding in Java
- A run-time viene considerato il tipo dinamico del
ricevitore della chiamata di metodo e da quello
avviene la ricerca gerarchica del metodo da
scegliere. - Non viene considerato il tipo dinamico dei
parametri. - Si continua ad andare in alto nella gerarchia di
classi finché non si arriva al primo applicabile
esattamente al tipo dinamico.
18Esempio
- class A h(int i)return 0
- f()return 1
- s(double d)return 2
- class B extends A f()return 3
- h(int i)return 4
- s(int i)return
5 - class C extends A f()return 6
- A a1new B()
- A a2new C()
- B bnew B()
- A anew A()
19Esempio
- a.s(3.0) //2
- a1.s(3.0) //2
- b.s(0) //5
- b.s(1.0) //2
- ((A) a1).h(4) //4
20Overloading in C
- In C è permesso
- Due funzioni con lo stesso nome ma parametri e
tipi di ritorno differenti - int media(int array, int size)
- double media(double a,double b)
- Due parametri passati per riferimento che
differiscono per il qualificatore const sono
considerati differenti - void f(int)
- void f(const int)
21Esempio
- In C e permesso loverloading di operatori
- class MyComplex
- double a,b
- MyComplex operator (const MyComplex obj)
- MyComplex temp
- temp.a(this).aobj.a
- temp.b(this).bobj.b
- return temp
22Implementazione delloverloading in C
- Ad ogni funzione del programma il compilatore
assegna un nome interno che dipende dal nome
della funzione e dai suoi parametri. - Il meccanismo di risoluzione dipende dal
compilatore.
23Risoluzione delloverloading in C
- Si passa attraverso un processo di corrispondenza
tra gli argomenti della chiamata e i parametri
della funzione. - Il compilatore confronta gli argomenti della
chiamata con le varie definizioni e se possibile
ne invoca una.
24Algoritmo di risoluzione delloverloading in C
- La risoluzione avviene in tre passi
- Identificazione delle funzioni candidate
(funzioni che hanno lo stesso nome della funzione
chiamata) - Scelta delle funzioni utilizzabili (funzioni i
cui parametri corrispondono agli argomenti della
chiamata per numero e tipo)
25Algoritmo di risoluzione delloverloading in C 2
- Scelta della migliore funzione utilizzabile (
funzione per cui gli argomenti corrispondono come
tipi statici ai parametri)
26Overloading in C
- Si possono dichiarare più metodi con lo stesso
nome ma parametri diversi. - E permesso loverloading di operatori.
- E permesso loverloading con tipi di ritorno
diverso.
27Esempio
- class MyComplex
- double a,b
- public static operator (MyComplex
a,MyComplex q) - MyComplex znew MyComplex((p.aq.a),(p.bq.b))
- return z
-
-
28Overloading di operatori in C
- Gli operatori unari che possono essere overloaded
in C sono - - ! -- true false
- Gli operatori binari che possono essere
overloaded sono - - / ltlt
- gtgt ! gt lt gt lt
29Risoluzione delloverloading in C
- Linsieme delle funzioni candidate è ridotto a
quelle funzioni applicabili rispetto alla lista
degli argomenti. - Se questo insieme è vuoto si ha un errore in
compilazione. - Altrimenti è scelta la migliore possibile.
30Risoluzione dellOverloading in C
- Lalgoritmo di risoluzione è simile a quello
utilizzato dal linguaggio Java.
31Esempio
- class A
- class B A
- class C B
- class D
- public static void m(A a)
- public static void m(B b)
- public static void m(A a, B b)
- public static void m(B b, A a)
32Esempio (continuo)
- A anew A()
- C cnew C()
- D dnew D()
- d.m(a)/ D.m(A a) gt d.m(A)/
- d.m(c)/ D.m(A a), D.m(B b)gtd.m(B)
- D.m(c,c)/D.m(A a,B b), D.m(B b, A a)
- Error
33Risoluzione degli operatori in C
- Le implementazioni degli operatori definite
dallutente hanno la precedenza su quelli
predefiniti.
34Overloading a run-time
- A differenza di Java durante lesecuzione, viene
ignorato il tipo dinamico delloggetto che ha
invocato il metodo e viene quindi applicato
quello scelto a compile-time.
35(No Transcript)
36Conclusioni
- Loverloading, se usato correttamente, migliora
la leggibilità del codice evitando nomi con
ridondanza di informazioni.
37Esempio
- Volendo definire una funzione che calcoli la
potenza di interi e unatra per i float, potremmo
chiamarle in due modi diversi (es.IPow e FPow). - Questo però nasconde la similarità della loro
funzionalità.
38Conclusioni
- E difficile da gestire per il compilatore.
- Il dynamic binding causa un rallentamento
nellesecuzione. - Il dynamic binding a run-time potrebbe dare
errori non segnalati in compile-time.