Vediamo l'esempio di prima in Ruby.
#!/usr/bin/env ruby
class Triangolo
def initialize(base, altezza)
@mbase= base
@maltezza = altezza
end
def calcolaArea
return (@mbase*@maltezza)/2
end
def to_s
return "Triangolo di area #{calcolaArea}"
end
end
class Quadrato
def initialize(lato)
@mlato = lato
end
def calcolaArea
return (@mlato*@mlato)
end
def to_s
return "Quadrato di area #{calcolaArea}"
end
end
def main()
forme = Array.new
forme.push(Triangolo.new(10,4))
forme.push(Quadrato.new(5))
forme.push(Triangolo.new(12,3))
forme.push(Quadrato.new(7))
for g in forme
puts g
end
end
main
Duck typing
Nell'esempio in Ruby, del tutto analogo a quello visto sopra in Java, risulta evidente che la parte di codice polimorfica, cioè sostanzialmente:
puts gfunziona sulla base del fatto che puts, dovendo stampare una stringa a video, cerca se nella classe è presente un metodo che converte l'oggetto a stringa: nel nostro caso è "to_s".
Questo metodo richiama il famoso calcolaArea ed è questo il metodo che deve essere presente nell'oggetto perchè il codice in main abbia un senso.
A differenza di Java però, Ruby ci permette di attuare questo meccanismo anche senza la specifica di un'interfaccia comune per Quadrato e Triangolo: molto semplicemente tale controllo è demandato al programmatore, il quale "sa" che Triangolo e Quadrato "sono" FormeGeometriche, e questo gli risparmia il lavoro di dover scrivere l'interfaccia. Questa tecnica è nota come duck typing (tipizzazione ad anatra).
Il prezzo da pagare è che, mentre in Java, un eventuale errore (ad esempio l'inserimento nella collezione forme di un oggetto che non è una FormaGeometrica, e quindi non ha un metodo calcolaArea) viene rilevato a compile-time, qui ce ne accorgeremo solamente a run-time.
Tirando le somme
Il polimorfismo è una tecnica dei linguaggi OOP che serve per limitare le parti di un programma che devono essere modificate, potendo costruire metodi che si comportano in modo diverso a seconda del tipo dell'oggetto passato come argomento.
Nei linguaggi OOP tradizionali, la tecnica prevede che tutti gli oggetti passati al metodo polimorfico debbano implementare la stessa interfaccia, mentre nei linguaggi OOP di scripting, come Ruby o Python, ciò non è necessario poichè si adotta il duck typing, ovvero il controllo sulla coerenza della tassonomia dei tipi è demandata al programmatore e non è necessario esplicitarla nel codice.
| Corso Ruby e Ruby On Rails Creare software ed applicazioni Web con Ruby e ROR. A partire da 49 €. |