Capítulo 15. Redefinición de métodos

En una subclase se puede modificar el comportamiento de las instancias redefiniendo los métodos de la superclase.


ruby> class Humano
ruby|   def identidad
ruby|           print "soy una persona.\n"
ruby|   end
ruby|   def tarifa_tren(edad)
ruby|           if edad < 12
ruby|                   print "tarifa reducida.\n"
ruby|           else
ruby|                   print "tarifa normal. \n"
ruby|           end
ruby|	  end
ruby| end
nil
ruby> Humano.new.identidad
soy una persona.
nil
ruby> class Estudiante<Humano
ruby|   def identidad
ruby|           print "soy un estudiante.\n"
ruby|   end
ruby| end
nil
ruby> Estudiante.new.identidad
soy un estudiante.
nil

Supongamos que en vez de reemplazar el método identidad lo que queremos es mejorarlo. Para ello podemos utilizar super


ruby> class Estudiante2<Humano
ruby|   def identidad
ruby|           super
ruby|           print "también soy un estudiante.\n"
ruby|   end
ruby| end
nil
ruby> Estudiante2.new.identidad
soy una persona.
también soy un estudiante.
nil

super nos permite pasar argumentos al método original. Se dice que hay dos tipos de personas ...


ruby> class Deshonesta<Humano
ruby|   def tarifa_tren(edad)
ruby|           super(11)       #quiero una tarifa barata
ruby|   end
ruby| end
nil
ruby> Deshonesta.new.tarifa_tren(25)
tarifa reducida.
nil
ruby> class Honesta<Humano
ruby|   def tarifa_tren(edad)
ruby|           super(edad)     #pasa el argumento entregado
ruby|   end
ruby| end
nil
ruby> Honesta.new.tarifa_tren(25)
tarifa normal.
nil