让超类方法在正确的命名空间中调用类

时间:2014-05-19 00:22:54

标签: ruby

我有一些包含duck-type类的命名空间,它们都从Base命名空间继承,如下所示:

module Base
  class Client
    def self.greet
      puts Wrapper
    end

    def do_stuff
      puts Wrapper
    end
  end

  class Wrapper
  end
end

module Website
  class Client < Base::Client
  end

  class Wrapper < Base::Wrapper
  end
end

Website::Client.greet
Website::Client.new.do_stuff

--- ---输出

基地::包装

基地::包装

我希望上面的代码能够打印(和引用)Website :: Wrapper,有没有办法通过改变我的继承结构来实现这个目的?

2 个答案:

答案 0 :(得分:0)

如果名为Wrapper的常量位于顶级命名空间中,您可以编写::Wrapper来引用它,但通常只需编写Wrapper即可。

答案 1 :(得分:0)

  

在Website :: Client中,如果我尝试调用另一个类,例如   Wrapper,它将调用Base :: Wrapper ...

我没有看到:

module Base

  class Client
  end

  class Wrapper
  end

end

module Website

  class Wrapper < Base::Wrapper
  end

  class Client < Base::Client
    p Wrapper     #=>Website::Wrapper

    def self.greet  #Create class method
      p Wrapper   #=>Website::Wrapper
    end

    def do_stuff
      p Wrapper   #=>Website::Wrapper
    end

  end
end

Website::Client.greet
Website::Client.new.do_stuff

--output:--
Website::Wrapper
Website::Wrapper
Website::Wrapper

您可以修改该示例以显示您遇到的问题吗?

对已修改问题的回复:

  

这只是不好的做法吗?

调用Base :: Client.greet并获取Website :: Wrapper会不会令人感到意外?

  

是否有一种简单的方法可以将子类中调用的方法默认为   该类的名称空间?

你是什么意思?在Website :: Client的singleton类中没有定义名为greet的类方法。如果你想覆盖Base :: Client.greet,你可以这样做。

此外,当您调用Website :: Client.greet时,您正在编写Website :: Client,因此您已经知道方法调用来自哪个类...但在Base :: Client.greet中,您可以添加该行puts self,这将标识调用该方法的对象,即Website :: Client类。