|
Passiamo a qualche dettaglio tecnico in più riferito ai
metodi. Ricordiamo che abbiamo detto che il '+' è
overloaded. Infatti la somma può essere fatta su tipi diversi, numeri
interi, numeri in virgola mobile e perfino stringhe. In realtà si
tratta di operatori nei fatti completamente diversi che hanno in
comune solamente il nome e qualche similutdine CONCETTUALE in quello
che fanno (è questa similitudine che giustifica il potenziale errore
indotto dal fatto che hanno lo stesso nome). Ma l'uomo è abituato a
pensare per similutidini, per cui l'overloading degli operatore, pur
non essendo totalmente trasparente a chi è inesperto, si rivelano un
utile meccanismo.
  |
due o più metodi possono avere lo stesso nome |
  |
i metodi devono avere argomenti diversi: |
void move(int x, int y)
{ ... }
void move(Point p)
{ ... }
I metodi sono l'equivalente per le classi di quello che sono gli
operatori per i tipi primitivi. Come tali, supportano anche essi una
forma di overloading. Infatti i metodi di una stessa classe
possono avere lo stesso nome ma un differente tipo e numero di argomenti.
Come si può notare nel listato il metodo può venire invocato usando l'unico nome move, ma in realtà si tratta di due metodi diversi. Per selezionare quale metodo viene effettivamente invocato si usa il tipo dei parametri.
  |
i metodi non si distinguono per il valore ritornato |
void move(int x, int y)
{ ... }
// errore!
boolean move(int x, int y)
{ ... }
Tuttavia se è sufficiente l'uso dei parametri per selezionare il metodo, non è sufficiente il tipo ritornato. Infatti ci sono troppe ambiguità, per cui due metodi non possono avere lo stesso nome, gli stessi parametri e un diverso tipo ritornato. In realtà ci sono casi in cui si presentano ambiguità anche i metodi con parametri di tipo diverso. Si tratta di casi abbastanza patologici e non frequenti, che vengono rilevati dal compilatore come errore.
|