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