Capítulo 13. Clases

El mundo real está lleno de objetos que podemos clasificar. Por ejemplo, un niño muy pequeño es probable que diga "guau guau" cuando vea un perro, independientemente de su raza; naturalmente vemos el mundo en base a estas categorías.

En terminología OO, una categoría de objetos, como "perro", se denomina clase y cualquier objeto determinado que pertenece a una clase se conoce como instancia de esa clase.

Generalmente, en Ruby y en cualquier otro lenguaje OO, se define primero las características de una clase, luego se crean las instancias. Para mostrar el proceso, definamos primero un clase muy simple Perro.

  ruby> class Perro
  ruby|   def ladra
  ruby|           print "guau guau\n"
  ruby|   end
  ruby| end
  nil
  

En Ruby, la definición de una clase es la región de código que se encuentra entre las palabras reservadas class y end. Dentro de esta área, def inicia la definición de un método, que como se dijo en el capítulo anterior, corresponde con algún comportamiento específico de los objetos de esa clase.

Ahora que tenemos definida la clase Perro, vamos a utilizarla:

  ruby> rufi = Perro.new
  #<Perro:0x401c444c>
  

Hemos creado una instancia nueva de la clase Perro y le hemos llamado rufi. El método new de cualquier clase, crea una nueva instancia. Dado que rufi es un Perro, según la definición de la clase, tiene las propiedades que se decidió que un Perro debía tener. Dado que la idea de Perrunidad es muy simple, sólo hay una cosa que puede hacer rufi

  ruby> rufi.ladra
  guau guau
  nil
  

La creación de una instancia de una clase se conoce, a veces, como instanciación. Es necesario tener un perro antes de experimentar el placer de su conversación; no se puede pedir simplemente a la clase Perro que ladre para nosotros:

  ruby> Perro.ladra
  ERR: (eval):1: undefined method `ladra' for Perro:Class
  

Tiene el mismo sentido que intentar comer el concepto de un sándwich

Por otro lado, si queremos oír el sonido de un perro sin estar emocionalmente atados, podemos crear (instanciar) un perro efímero, temporal y obtener un pequeño sonido antes de que desaparezca.

  ruby> (Perro.new).ladra  # o también,  Perro.new.ladra
  guau guau
  nil
  

Pero un momento, "¿qué es todo esto de que a continuación el pobre tipo desaparece?". Pues es verdad, si no nos preocupamos de darle un nombre (como hicimos con rufi) el recolector de basura automático de Ruby decide que se trata de un perro perdido, no deseado y sin piedad se deshace de él. Ciertamente está muy bien, porque podemos crear todos los perros que queramos.