Empezaremos viendo como son y como funcionan las objetos, clases y variables en Ruby.
Para ello crearemos una clase llamada “Song”
class Song
def initialize(name, artist, duration)
@name= name
@artist= artist
@duration = duration
end
end
El método initialize es especial en el código Ruby. Cuando tu llamas a Song.new para crear un nuevo objeto Song, Ruby reserva memoria para almacenar al futuro objeto, y acto seguido llama al método initialize el cual recibe parámetros (tres en nuestro caso concreto). Gracias al método initialize podemos crear los objetos por defecto.
Dentro de el método initialize hay instance variables, estas sirven para que cada instancia de una clase tenga su propias variables distintas en contenido respecto al resto de instancias de esa misma clase. En Ruby se utiliza la @ para indicar que es una instance variable. Estas variables podrán ser accedidas por todos los métodos del objeto, y como dijimos cada objeto tiene su propia copia de estas variables.
Mientras desarrollamos software seguro que queremos ver mas de una vez los valores de alguna instancia del objeto Song. Para ello haremos uso del mensaje estándar to_s. Por defecto el mensaje to_s solo muestra el object id pero nosotros vamos a redefinir este mensaje para que muestre mas información.
En Ruby las clases no son cerradas, es decir se pueden seguir añadiendo métodos a una clase existente. Usaremos como ejemplo la modificacion del mensaje to_s. Volvamos a la definicion de la clase Song y añadamos el mensaje to_s.
class Song
def to_s
"Song: #@name--#@artist (#@duration)"
end
end
usaremos el caracter # para interpolar los valores de las variables.
Ahora si le mandamos el mensaje to_s a un objeto Song, el resultado será el siguiente:
"Song: culo--pelon (334)"
HERENCIA Y MENSAJES
La herencia te permite crear clases que son una especialización de otra clase ya existente. Imaginemos la clase Jukebox, la cual tiene el concepto de canciones, las cuales están encapsuladas en la clase Song. El problema es que ahora nosotros queremos tener canciones de karaoke, este tipo de canción no tiene audio, pero tiene la letra de la canción, la cual va fluyendo por la pantalla.
Un enfoque a este problema seria crear una nueva clase karaokeSong que es igual que una canción pero con la letra de la misma.
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics= lyrics
end
end
El “< Song” en la definición de la clase indica a Ruby que la clase KaraokeSong es una subclase de la clase Song. Si creasemos un objeto de la clase KaraokeSong y le dieramos el mensaje to_s, veriamos que ocurre lo siguiente:
cancion=KaraokeSong(“My way”,”sinatra”, 323, “And who, the...”)
cancion.to_s
=> “Song: My way--sinatra (225)”
Vemos que funciona correctamente excepto que no muestra la letra de la canción. Esto se debe a que cuando enviamos un mensaje a un objeto, este mira si su clase implementa un método con el mismo nombre que el mensaje y lo ejecuta, si no implementa un método que coincida con el mensaje, Ruby buscara el método en la clase antecesora, hasta que encuentre un método que coincida con el nombre del mensaje, o emita un error(el cual puede ser capturado para evitar errores en tiempo de ejecucion) porque no ha encontrado nada.