2011-07-19 11 views
5

W poniższym przypadku testowego:W jaki sposób Ruby obsługuje dziedziczenie klas zagnieżdżonych?

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 

Wyniki w:

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

Jak uzyskać konkretną Package_A.component i Package_B.component?

Odpowiedz

6

Klasa Component jest zadeklarowana w Package, więc wydaje się poprawna. :: informuje, aby wyszukać nazwę Component w zakresie Package_A. Ponieważ nie ma tam Component, wyszukuje nadklasę.

Ten przykład pokazuje, jak osiągnąć to, co chcesz. Może być prostszy sposób, chętnie bym to zobaczył.

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 

Ten mniej więcej powinien wyjaśniać zakres działania w takich przypadkach. Mam nadzieję że to pomoże.

+0

Dzięki @Sorrow dla powyższego przykładu ... Użyłem go do rozwiązania mojego problemu z aplikacją. Być może ktoś będzie próbował wesprzeć ** inheritable_nested_class Class1, Class2 ... ** np inheritable_nested_class Komponentu skutkowałoby to w powyższym boilerplate są automatycznie generowane w podklas dziedziczących z klasy ze wspomnianą dyrektywą. Byłoby to przyjemne zadanie w zaawansowanej klasie metaprogramowania :-) – DMisener

Powiązane problemy