# 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:
Publicar un comentario