Java ed altri linguaggi molto tipicizzati consentono agevolmente di eseguire l'overloading dei metodi. In poche parole, è possibile definire uno stesso metodo più volte variando il tipo ed il numero di parametri della chiamata.
Ecco un esempio tratto dal libro Thinking in Java.
//: OverloadingOrder.java // Overloading based on the order of // the arguments. public class OverloadingOrder { static void print(String s, int i) { System.out.println( "String: " + s + ", int: " + i); } static void print(int i, String s) { System.out.println( "int: " + i + ", String: " + s); } public static void main(String[] args) { print("String first", 11); print(99, "Int first"); } } ///:~
Ruby non supporta l'overloading, o meglio, come per le classi astratte non lo supporta nativamente ma è possibile emularlo.
Definendo un metodo con un unico parametro (*args), il metodo potrà essere richiamato con un numero arbitrario di parametri. Internamente potremo così calcolare il numero ed il tipo di parametri e gestire correttamente il funzionamento del metodo.
def overloaded_method(*args) if args.size < 2 # else # end end
Per approfondimenti vi lascio al tutorial Ruby Overloading Methods pubblicato su RubyLearning.com.
Esiste infine una interessante alternativa di una libreria chiamata overload che permette di eseguire qualcosa del genere
require "overload" class Foo def initialize puts "No args" end overload(:initialize) def initialize(arg) puts "One arg (Fixnum)" end overload(:initialize, Fixnum) def initialize(arg) puts "One arg (String)" end overload(:initialize, String) end