sábado, 1 de octubre de 2011

Programación orientada a objetos con Ruby

Nota: Antes de comenzar si quieren probar el código que verán a continuación para que sea mas interactivo, les recomiendo entrar a esta pagina para probar el código que estaré explicando en esta entrada.



Para definir una clase en Ruby se hace de la siguiente manera, seguido de un constructor que instanciara las variables del objeto.
class Animal #Siempre los nombres de las clases inician con mayuscula
def initialize(nombre, ruido)

=begin
Este metodo es un constructor y los constructores en Ruby siempre se llaman initialize
y es muy parecido a los constructores que usamos en los demás lenguajes excepto por el nombre
=end

@nombre = nombre #Cuando agregamos esto @ quiere decir que estamos instanciando las variables
@ruido = ruido

end

end


Los metodos por default son public en Ruby, de igual que los demas lenguajes como Java tiene metodos private y protected, para decir que un metodo es privado o protegido de hace de la siguiente manera.
class Animal
def grita
end 

private#Siempre para definir una clase privada primero se le pone la palabra clave private
def genero
end

protected#Al igual manera que private se le coloca primero la palabra clave protected
def patas

end

end

Ahora hablemos de herencia, bueno la herencia en Ruby es algo que se representa de manera jerárquica como si fuera un árbol, donde hay una clase padre y después de deriva de clases hijo, para entender muy bien como se representa les mostrare este diagrama que muestra como lo hace.

Este diagrama lo tome de un libro llamado :The Book of Ruby por Huw Collingbourne de la cual yo se los recomiendo.




Y como Ruby define la herencia? bueno esto lo veremos a continuación.

class Animal
def initialize(nombre,patas)
@nombre = nombre
@patas = patas
end

def nombre
return @nombre
end

def nombre=(nombre)#Nunca hagas esto-> "def nombre= (nombre)" osea dejar un espacio porque dará error.
=begin
Esto es igual a tener un set_nombre para "setear" una variable de igual si no entiendo a que me refiero orita lo podrán ver en los siguientes metodos.
=end
@nombre=nombre
end

def get_patas#Es igual a tener los metodos anteriores pero mas simple
return @patas
end

def set_patas(patas)
@patas=patas
end
end
#Ahora usando la herencia
class Perro < Animal
def initialize(nombre,patas,raza)
super(nombre,patas)#Donde se hereda nombre y patas de la clase Animal al igual que sus clases
#publicas o protegidas.
@raza = raza #se instancia una variable de la cual es de la clase Perro
end

def raza
return @raza
end

def raza=(raza)
@raza = raza
end

perro1 = Perro.new('Spyke',4,'Husky')
puts(perro1.nombre)
puts(perro1.get_patas)
puts(perro1.raza)

puts"Este es contenido de mi objeto #{perro1.inspect}"
=begin
El objeto perro1 llama al metodo inspect para ver el contenido del objecto por lo cual se le identifica por un numero hexadecimal con la que lo identifica Ruby, y cuales atributos tiene.
=end
p(perro1) #Esto es lo mismo que usar inspect
end
Ahora como en Ruby hay poliformismo que sirve para dar genericidad a un método de una clase. En la cual veremos que definire una clase llamada Perro y otro Gato por la cual donde cada quien tiene sus propias caracteristicas.
class Animal
def initialize(nombre,patas,raza)
@nombre = nombre
@patas = patas
@raza = raza
end

def nombre
return @nombre
end

def nombre=(nombre)#Nunca hagas esto-> "def nombre= (nombre)" osea dejar un espacio porque dará error.
=begin
Esto es igual a tener un set_nombre para "setear" una variable de igual si no entiendo a que me refiero orita lo podrán ver en los siguientes metodos.
=end
@nombre=nombre
end

def get_patas#Es igual a tener los metodos anteriores pero mas simple
return @patas
end

def set_patas(patas)
@patas=patas
end

def raza
return @raza
end

def raza=(raza)
@raza=raza
end

end
#Ahora usando la herencia
class Perro < Animal
def initialize(nombre,patas,raza)
super(nombre,patas,raza)#Donde se hereda nombre,patas y raza de la clase Animal al igual que sus clases
#publicas o protegidas.
end
end

class Gato < Animal
def initialize(nombre,patas,raza)
super(nombre,patas,raza)
end
end

gato1 = Gato.new('Gatubela',4,'Persa')
print 'Gato'
puts(gato1.nombre)
puts(gato1.get_patas)
puts(gato1.raza)
print("\n")
perro1 = Perro.new('Spyke',4,'Husky')
print 'Perro'
puts(perro1.nombre)
puts(perro1.get_patas)
puts(perro1.raza)

puts"Este es contenido de mi objeto #{perro1.inspect}"
=begin
El objeto perro1 llama al metodo inspect para ver el contenido del objecto por lo cual se le identifica por un numero hexadecimal con la que lo identifica Ruby, y cuales atributos tiene.
=end
p(gato1) #Esto es lo mismo que usar inspect


1 comentario: