Overloading - PowerPoint PPT Presentation

1 / 38
About This Presentation
Title:

Overloading

Description:

Overloading Differenze nei vari linguaggi di Elisa Trifir e Barbara Tacchino Argomenti trattati Overloading: un tipo di Polimorfismo Overloading in Java Overloading ... – PowerPoint PPT presentation

Number of Views:64
Avg rating:3.0/5.0
Slides: 39
Provided by: Templ177
Category:

less

Transcript and Presenter's Notes

Title: Overloading


1
Overloading
  • Differenze nei vari linguaggi
  • di
  • Elisa Trifirò e Barbara Tacchino

2
Argomenti 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

4
Polimorfismo 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.

5
Polimorfismo 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

6
Polimorfismo 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.

7
Polimorfismo ad-hoc
  • Nel polimorfismo ad-hoc rientrano
  • Overloading
  • Coercion

8
Coercion
  • 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.

9
Overloading
  • 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

10
Overloading 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.

11
Esempio
  • 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.

12
Esempio
  • 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)

13
Risoluzione 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.

14
Algoritmo 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

15
Considerazioni 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.

16
Un 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.

17
Dynamic 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.

18
Esempio
  • 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()

19
Esempio
  • a.s(3.0) //2
  • a1.s(3.0) //2
  • b.s(0) //5
  • b.s(1.0) //2
  • ((A) a1).h(4) //4

20
Overloading 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)

21
Esempio
  • 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

22
Implementazione 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.

23
Risoluzione 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.

24
Algoritmo 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)

25
Algoritmo di risoluzione delloverloading in C 2
  1. Scelta della migliore funzione utilizzabile (
    funzione per cui gli argomenti corrispondono come
    tipi statici ai parametri)

26
Overloading 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.

27
Esempio
  • class MyComplex
  • double a,b
  • public static operator (MyComplex
    a,MyComplex q)
  • MyComplex znew MyComplex((p.aq.a),(p.bq.b))
  • return z

28
Overloading 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

29
Risoluzione 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.

30
Risoluzione dellOverloading in C
  • Lalgoritmo di risoluzione è simile a quello
    utilizzato dal linguaggio Java.

31
Esempio
  • 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)

32
Esempio (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

33
Risoluzione degli operatori in C
  • Le implementazioni degli operatori definite
    dallutente hanno la precedenza su quelli
    predefiniti.

34
Overloading 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)
36
Conclusioni
  • Loverloading, se usato correttamente, migliora
    la leggibilità del codice evitando nomi con
    ridondanza di informazioni.

37
Esempio
  • 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à.

38
Conclusioni
  • 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.
Write a Comment
User Comments (0)
About PowerShow.com