martes, 16 de diciembre de 2008

Como mantener una lista de subclasses en una clase

Definiendo el método de clase inherited, se pueden hacer muchas cosas cuando se hereda una clase, entre ellas esto:


# defino un modulo para agrupar los métodos que se agregan a las clases
module SubclassesRegister
def subclasses
if @subclasses == nil
@subclasses = []
end

@subclasses
end
end

# la clase principal, la que implementa la funcionalidad de registrar las subclases
class RegisteredClass

def self.inherited(x)

# se le agregan los metodos para que mantenga la lista de superclases ( a la superclase de x)
x.superclass.extend SubclassesRegister unless x.superclass.include? SubclassesRegister

# cuando alguna clase hereda de esta, se registra la subclase (si la superclase no es esta)
if x.superclass != RegisteredClass
self.register_subclass(x)
end
end

def self.register_subclass(subclass)

superclass = subclass.superclass
print "registered #{subclass} as subclass of #{superclass}\n"

# agregar la clase subclass a la lista de subclases de su superclase
superclass.subclasses << subclass
end
end

class Animal < RegisteredClass
def self.enu
# puedo obtener las subclases con solo usar el metodo "subclasses"
print "subclases de Animal: #{subclasses.join("; ")}\n"
end
end

class Perro < Animal
def self.enu
# cualquier clase de la jerarquia que extienda directa o indirectamente de RegisteredClass
# puede obtener la lista de sus subclases
print "subclases de Perro: #{subclasses.join("; ")}\n"
end
end

class Terrier < Perro
end

class Dogo < Perro
end

class Gato < Animal
end


Animal.enu
Perro.enu




Espero que les haya sido de utilidad

No hay comentarios: