我有一些包含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,有没有办法通过改变我的继承结构来实现这个目的?
答案 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类。