lunes, 5 de mayo de 2014

Clases y objetos en Ruby (IV)

Cuando utilicemos clases y objetos, puede ser interesante tener un alcance más amplio y compartido que el del propio objeto. De esta manera, podemos compartir un mismo valor para todos los objetos de una misma clase. También podemos definir métodos que puedan ser de ámbito generalista, de modo que podemos invocarlos sin necesidad de instanciar un objeto.

VARIABLES DE CLASE

Una variable de clase es una variable que es compartida entre varios objetos de esa clase. No hay que confundir una propiedad con una variable de clase. La propiedad es una variable con una entidad y valor propios del propio objeto. Una variable de clase, sin embargo, es una entidad única y compartida para todos los objetos instanciados de esa clase.

Para declarar una variable de clase, se escribe dos arrobas (@@) antes del nombre de la variable.

En el siguiente ejemplo definimos una clase con una propiedad y una variable de clase.

class MiClase
   @@varClase = 1

   def initialize
     @propiedad = 1
   end

   def propiedad=(valor)
     @propiedad=valor
   end

   def propiedad
     @propiedad
   end

   def varClase=(valor)
     @@varClase=valor
   end

   def varClase
     @@varClase
   end
end

obj1 = MiClase.new
obj2 = MiClase.new

# Se refiere a una variable distinta en cada objeto
obj1.propiedad = 10
obj2.propiedad = 20

# Se refiere a la misma variable en todos los objetos
obj1.varClase = 25 # Valdra 25 en todos los objetos
obj2.varClase = 30 # Valdra 30 en todos los objetos (cambia 25 por 30)

puts "obj1 > @propiedad = #{obj1.propiedad} / @@varClase = #{obj1.varClase}"
puts "obj2 > @propiedad = #{obj2.propiedad} / @@varClase = #{obj2.varClase}"

El resultado será el siguiente:

obj1 > @propiedad = 10 / @@varClase = 30
obj2 > @propiedad = 20 / @@varClase = 30

Una variable de clase tiene un alcance privado, por lo que, para acceder a su valor, requiere que se escriban métodos de acceso.

METODOS DE CLASE

Un método de clase es un método que no está ligado a un objeto en particular, el cual puede ser invocado sin crear una instancia de objeto.

La utilidad de los métodos de clase es la de facilitar de herramientas de uso general y/o genéricas.

La forma de declarar y de invocar a este tipo de métodos es anteponiendo el nombre de la clase (seguido de un punto) al nombre del método.

class MiClase
   def initialize(propiedad)
     @propiedad=propiedad
   end

   # Metodo de instancia
   def calcular_cubo
     @propiedad * @propiedad
   end

   # Metodo de clase
   def MiClase.sumar(valor1, valor2)
     valor1 + valor2
   end
end

# El metodo de clase se puede invocar sin instanciar objetos
puts "La suma de 2 + 5 es #{MiClase.sumar(2, 5)}"

# El metodo de instancia requiere un objeto
obj = MiClase.new(3)
puts "El cubo de 3 es #{obj.calcular_cubo}"



TE PUEDE INTERESAR