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 = 30Una 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}" |