2011-07-19 10 views
5

En el siguiente caso de prueba:¿Cómo maneja Ruby la herencia para las clases anidadas?

class Package 
    class Component 
     def initialize 
      p [:initialize,self] 
     end 
    end 
end 

class Package_A < Package 
end 

class Package_B < Package 
end 

# Why are the following components of type Package and not Package_A and Package_B 
component=Package_A::Component.new 
p component 

component=Package_B::Component.new 
p component 

Resultados en:

[:initialize, #<Package::Component_1:0x2c0a8f8>] 
#<Package::Component:0x2c0a8f8> 
[:initialize, #<Package::Component_1:0x2c0a5b0>] 
#<Package::Component:0x2c0a 

¿Cómo consigo un Package_A.component específico y Package_B.component?

Respuesta

6

Clase Component se declara en Package, por lo que parece correcto. El :: dice que busque el nombre Component en el alcance de Package_A. Como no hay Component allí, busca la superclase.

Este ejemplo muestra cómo lograr lo que desea. Podría haber una manera más simple, estaría feliz de verlo.

class Package 
    class Component 
    def foo 
     puts "bar" 
    end 
    end 
end 

class Pack_a < Package 
end 

Pack_a::Component.new.foo 
#=> bar 
# as expected, though we actually have Package::Component 

class Pack_b < Package 
    class Component 
    end 
end 

Pack_b::Component.new.foo 
#=> NoMethodError: undefined method 'foo' for Pack_b::Component 
# this error is because Pack_b::Component has nothing to do with Package::Component 

class Pack_c < Package 
    class Component < Package::Component 
    end 
end 

Pack_c::Component.new.foo 
#=> bar 
# as expected 

Pack_c::Component.new 
#=> Pack_c::Component 
# this Component is a subclass of Package::Component 

Esto, sin embargo, debe explicar cómo funciona el alcance en tales casos. Espero que esto ayude.

+0

Gracias @Sorrow por el ejemplo anterior ... Lo usé para resolver mi problema de aplicación. Tal vez alguien intentará apoyar ** inheritable_nested_class Clase 1, Clase 2 ... ** por ejemplo: inheritable_nested_class Componente esto resultaría en el texto modelo anterior que se genera de forma automática en las subclases que heredan de la clase con dicha Directiva. Sería una buena tarea en una clase de metaprogramación avanzada :-) – DMisener

Cuestiones relacionadas