El comportamiento de una instancia viene determinado por su clase, pero hay veces que sabemos que una determinada instancia debe tener un comportamiento especial. En la mayoría de los lenguajes debemos meternos en la problemática de crear otra clase e instanciarla sólo una vez. En Ruby se puede asignar a cada objeto sus propios métodos. Veamos un ejemplo:
class Prueba def imprimir_valor print "Hola!!\n" end end test1 = Prueba.new test2 = Prueba.new def test2.imprimir_valor print "Hola desde test2!!\n" end ruby> test1.imprimir_valor Hola!! nil ruby> test2.imprimir_valor Hola desde test2!! nil
En este ejemplo, test1 y test2 pertenecen a la misma clase, pero a test2 se le ha redefinido el método imprimir_valor y por lo tanto se comportan de forma diferente. Un método que pertenece sólo a un objeto se conoce como método singleton.
Los métodos singleton no son únicos de Ruby, aparecen también en CLOS, Dylan, entre otros. Otros lenguajes como por ejemplo Self, Javascript, NewtonScript, Lua e Io sólo tienen métodos singleton. A estos se les conoce como lenguajes basados en prototipos, dado que implementan la orientación a objetos sin el concepto de clase, sino que por medio del prototipado.
En Dylan, los métodos no están intrínsecamente asociados a ninguna clase en particular; métodos se pueden considerar como existente fuera de las clases. Como CLOS, Dylan se basa en multimethods o Multiple dispatch. Multimethods es una característica de algunos lenguajes orientados a objetos en los cuales los métodos o funciones, pueden ser dinámicamente seleccionados en tiempo de ejecución para ser ejecutados dependiendo por ejemplo del tipo de un parámetro o del contexto.
Métodos singleton es una característica muy interesante y algunos lenguajes lo implementan con prototipos y otros con Multimethods.
<!--
-->
Ver todos los comentarios en https://www.genbeta.com
VER 0 Comentario