2011-07-22 7 views
5

que me gustaría construir una función de "crear" que me da las siguientes capacidades:Crear clase de forma dinámica, con la herencia y descriptores de acceso particulares

zoo=[] 
zoo << create(:dog,4) 
zoo[0].class #Dog class 
myDog=zoo[0].new("foobar") #instance of Dog 
myDog.legs #4 legs because my dog is a Dog 
zoo[0].class.legs #4 
zoo[0].class.superclass #Animal 
zoo[0].class.superclass.legs #whatever, but they have legs 

"crear (perro, 4)" produce una nueva clase Perro que hereda Animal etc.

¿Puede ayudarnos con esta pregunta de metaprogramación aparentemente simple?

Respuesta

5
class Animal 
    def self.legs=(legs) 
    @legs = legs 
    end 

    def self.legs 
    @legs 
    end 

    def legs 
    self.class.legs 
    end 
end 

def create(sym, legs) 
    klass = Object.const_set(sym.to_s.capitalize, Class.new(Animal)) 
    klass.legs = legs 
    klass 
end 

kdog = create(:dog, 4) 
kalien = create(:alien, 3) 

dog = kdog.new 
alien = kalien.new 

puts kdog 
puts kdog.class 
puts kdog.superclass 
puts kdog.legs 

puts dog.class 
puts dog.legs 

puts "------" 

puts kalien 
puts kalien.class 
puts kalien.superclass 
puts kalien.legs 

puts alien.class 
puts alien.legs 

Salida:

Dog 
Class 
Animal 
4 
Dog 
4 
------ 
Alien 
Class 
Animal 
3 
Alien 
3 
+0

perfecto! Me quedé pegado a Class.new. No estaba al tanto de Class.new (Animal). ¡Terrible! – JCLL

Cuestiones relacionadas