/* *************************************************************************
* Pensate a come risolvere questo problema: dobbiamo sommare 3 coppie di
* variabili di 3 tipi diversi: int,long,float. In C occorre scriversi 3
* funzioni di somma, una per gli int, una per i long, e una per i float:
*
* int sommainteri(int a,int b) {...}
* long sommalong(long c,long d) {...}
* float sommafloat(float a,float b) {...}
*
* In seguito, nel programma, dobbiamo stare attenti ad usare la funzione
* giusta a seconda del tipo da sommare:
*
* bau = sommafloat(miofloat1,miofloat2);
* beu = sommalong(miolong1,miolong2);
* bou = sommaint(mioint1,mioint2);
*
* Se poi le mie variabili si chiamano sbirulino, scarrafone, ecc., dovro'
* anche andarmi a cercare ogni volta nel listato la dichiarazione per
* ricordarmi il loro tipo, per usare la funzione giusta.
* In Java, invece, grazie al polimorfismo, possiamo sovrapporre metodi
* aventi lo stesso nome, purche' abbiano parametri diversi: in questo
* modo, possiamo riscrivere i 3 metodi visti prima dandogli lo stesso nome:
*
* int somma(int a,int b) {...}
* long somma(long c,long d) {...}
* float somma(float e,float f) {...}
*
* Attenzione al fatto che vengono considerati solo i tipi dei parametri
* (int,long,float), non i nomi delle variabili (a,b,c): se si scrivono
* due metodi come questi:
*
* int somma(int a,int b) {...}
* int somma(int c,int d) {...}
*
* Facciamo una cosa illegale, in quanto i due metodi sono equivalenti,
* avendo gli stessi tipi nei parametri.
* Questa sovrapposizione (overloading), ci permette ora di scrivere in
* modo molto piu' semplice il listato, usando somma() per tutti i casi:
*
* bau = somma(miofloat1,miofloat2);
* beu = somma(miolong1,miolong2);
* bou = somma(mioint1,mioint2);
*
* Questo approccio e' migliore dal punto di vista logico, infatti quando
* programmiamo e sommiamo la variabile X con la variabile Y, spesso non
* ci ricordiamo il tipo di queste ultime, non essendo fondamentale, ma
* se dobbiamo usare funzioni diverse a seconda del tipo, allora siamo
* costretti a far entrare nel nostro ragionamento anche questo, facendoci
* distrarre. Se dovessimo usare degli operatori diversi a seconda del
* tipo di numeri anche quando facciamo i conti a mente, ad esempio dovessimo
* pensare: "1 piuintero 1 = 2", "1 piufloat 1 = 2", allora fare i conti
* della spesa diventerebbero difficili anche per un prof. di matematica.
* Invece, grazie al polimorfismo, si puo' "scaricare" questo compito al
* compilatore, lasciando a noi i problemi piu' seri.
* Da notare che il tipo di valore restituito dal metodo (ritorno) non
* conta quando il compilatore deve scegliere che overload chiamare: per
* tale scopo sono presi in considerazione solo i parametri in entrata.
************************************************************************ */
import java.io.*; // Include le funzioni I/O standard di base.
/* ********************************************************************** */
public class Jlez8a { // Da qua inizia la classe Jlez8a
///////////////////////////////////////////////////////////////////////////
// Il main...
///////////////////////////////////////////////////////////////////////////
public static void main(String args[]) // Definiamo il metodo Main.
{ // Inizio del main()
int mioint1 = 15; // Variabile di tipo int
int mioint2 = 50; // Variabile di tipo int
long miolong1 = 150000; // variabile di tipo long
long miolong2 = 1666000; // variabile di tipo long
// Per indicare i numeri "float" occorre aggiungere una F finale.
// Se non si specifica niente, si indicano i double (se col ".") o int.
float miofloat1 = 3.02f; // Variabile di tipo float
float miofloat2 = 32.24f; // Variabile di tipo float
// Ora sommiamo coppie di variabili di 3 tipi diversi usando sempre somma()
System.out.print(mioint1 + " + " + mioint2 + " = ");
System.out.println(somma(mioint1,mioint2));
System.out.print(miolong1 + " + " + miolong2 + " = ");
System.out.println(somma(miolong1,miolong2));
System.out.print(miofloat1 + " + " + miofloat2 + " = ");
System.out.println(somma(miofloat1,miofloat2));
} // Fine del metodo principale Main()
/* Ecco i 3 metodi aventi lo stesso nome e parametri diversi, che grazie
* al polimosfismo si overloadano (soprappongono): ogni volta verra'
* chiamato automaticamente il metodo giusto a seconda del tipo.
*/
public static int somma(int a,int b)
{
return(a+b);
}
// Ora la versione per i long
public static long somma(long c,long d)
{
return(c+d);
}
// Infine la versione per i float
public static float somma(float e,float f)
{
return(e+f);
}
} // Fine della classe Jlez8a
/* *************************************************************************
* L'overloading permette di accedere ad un unsieme di metodi simili (almeno
* a livello logico) usando lo stesso nome.
* Naturalmente un'altra comodita' del polimorfismo e' quella di aggiungere
* dei parametri opzionali ad una funzione.
************************************************************************ */
