Ruby如何处理嵌套类的继承?

DMi*_*ner 6 ruby inheritance nested-class

在以下测试用例中:

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
Run Code Online (Sandbox Code Playgroud)

结果是:

[:initialize, #<Package::Component_1:0x2c0a8f8>]
#<Package::Component:0x2c0a8f8>
[:initialize, #<Package::Component_1:0x2c0a5b0>]
#<Package::Component:0x2c0a
Run Code Online (Sandbox Code Playgroud)

如何获取特定的Package_A.component和Package_B.component?

Sor*_*row 6

Component声明了类Package,所以看起来是正确的.该::通知来查找名称Component中的范围Package_A.由于没有Component,它会查找超类.

这个例子展示了如何实现你想要的.可能有一种更简单的方法,我很乐意看到它.

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
Run Code Online (Sandbox Code Playgroud)

这更应该解释范围如何在这种情况下起作用.希望这可以帮助.