2012-05-30 29 views
1

重写我有一个类层次结构,如下:调用父类的构造时初始化由包括模块

class Tree 
    def initialize(id, value) 
    @id, @value = id, value 
    end 
end 

class Entity < Tree 

    include Mongoid::Document 

    def initialize(id, value) 
    # Do some stuff... 
    super(id, value) 
    end 

end 

但是,调用superEntity#initialize方法中调用initialize方法位于Mongoid::Document,而不是一个父类Tree

如何在Mongoid::Document模块已包含之后,从Entity#initialize正文中调用Tree#initialize方法?

回答

4

这就是Ruby的工作原理。当你包含一个模块时,ruby隐式地创建一个匿名类,并将它放在方法查找队列中当前的上方。

也打电话给Entity.ancestors将在列表中显示Mongoid::Document

有一个伟大的书,我可以推荐:Metaprogramming Ruby通过Paolo Perotta

而且,这里是a forum thread on a similar topic explaining super stuff

更新:

如果避免调用模块构造器是你想要的这里是一个可能的伎俩

class Entity < Tree 

    def initialize(id, value) 
    # Do some stuff... 
    # initialize first 
    super(id, value) 
    # and after that - extend 
    extend Mongoid::Document 
    end 

end 

此方法未在模块上运行self.included。如果你需要保留这个功能,仍然不是runnin模块的初始化工具,本征类可以在init中使用:

class Entity < Tree 

    def initialize(id, value) 
    # Do some stuff... 
    # initialize first 
    super(id, value) 
    # and after that - include into eigenclass 
    class << self 
     include Mongoid::Document 
    end 
    end 

end 
+0

谢谢你使这个更清晰。但我的问题是:我如何从Entity#initialize方法的主体访问Tree#initialize方法? – user2398029

+0

检查更新。包含模块的方式可能不同。 –