En Ruby, las clases nunca están cerradas: siempre se pueden añadir métodos a una clase. Esto es válido tanto para las clases que escribas, como para las que ya están incluidas con el intérprete. Todo lo que hay que hacer, es continuar con la definición de la clase:
require 'moto'
m = moto.new('Yamaha', 'rojo')
m.arrancar
class Moto
def informe_moto
puts 'El color de la moto es ' + @color
puts 'La marca de la moto es ' + @marca
end
end
m.informe_moto
Ahora añadamos un método a la clase String
:
class String
def num_caracteres
puts self.size
end
end
texto = 'Cielo empedrado, suelo mojado'
texto.num_caracteres
Si se escribe un nuevo método que conceptualmente pertenece a la clase original, se puede reabrir el fichero de la clase, y añadir el método a la definición de la clase. Esto hay que hacerlo cuando el método es de uso frecuente, y se está seguro que no entrará en conflicto con otros métodos definidos en otras librerías que se usen más adelante.
Si el método no será usado frecuentemente, o no se quiere tomar el riesgo de modificar la clase después de su creación, crear una subclase (ver Herencia) es la mejor opción. Una clase puede sobrescribir los métodos de la clase de la que desciende. Y es más seguro, por que la clase original permanece intacta.
Las clases en Ruby sólo pueden tener un método con un nombre dado. Para tener métodos "distintos" con el mismo nombre, se puede jugar con el número de argumentos:
# Un cuadrado se puede definir de dos formas:
# Cuadrado.new([x_sup, y_izq], ancho, alto)
# Cuadrado.new([x_sup, y_izq], [x_inf, y_der])
class Cuadrado
def initialize(*args) # * implica número variable de argumentos
if args.size < 2 || args.size > 3
puts 'ERROR: Este método toma dos o tres argumentos'
else
if args.size == 2
puts 'Dos argumentos'
else
puts 'Tres argumentos'
end
end
end
end
Cuadrado.new([10,23], 4, 10) # Tres argumentos
Cuadrado.new([10,23], [14,13]) # Dos argumentos
Cuadrado.new([10,23], [14,13],4,10) # ERROR: Este método toma dos o tres argumentos
El programa está incompleto, pero es suficiente para ver cómo se puede conseguir la sobrecarga de métodos.