执行包含多个模块的相同名称的方法

时间:2012-10-09 12:29:20

标签: ruby inheritance module

我有两个模块具有相同的方法名称。当我在某个类中包含两个模块时,只执行最后一个模块的方法。我需要在初始化类时执行它们:

class MyClass
    include FirstModule
    include SecondModule

    def initialize
        foo # foo is contained in both modules but only the one in SecondModules is executed
    end
end

可行吗?

2 个答案:

答案 0 :(得分:10)

正如Yusuke Endoh所说,Ruby中的一切都是可行的。在这种情况下,你必须忘记只是说“foo”的便利性,你必须非常清楚你真正想要做的事情,比如:

class MyClass
  include FirstModule
  include SecondModule
  def initialize
    FirstModule.instance_method( :foo ).bind( self ).call
    SecondModule.instance_method( :foo ).bind( self ).call
  end
end

'FirstModule.instance_method ......'这一行可以简单地用'foo'代替,但是通过明确表示,你确保无论如何,你都在调用mixin中的方法,你认为你做的是

答案 1 :(得分:7)

您可以修改附带的模块吗?也许您只需在第二个模块中调用super

module M1
  def foo
    p :M1
  end
end

module M2
  def foo
    p :M2
    defined?(super) && super
  end
end

class SC
  include M1
  include M2

  def initialize
    foo
  end
end

SC.new

或许你真的想要这样做?

module M1
  def bar; p :M1 end
end

module M2
  include M1
  def foo; bar; p :M2 end
end

class SC
  include M2
  def initialize; foo end
end

请参阅live demo here