如何覆盖扩展方法?

时间:2017-06-09 10:20:39

标签: ruby

示例代码:

module B
  def f2
    puts "B::f2"
  end
end

class C
  def initialize
    extend B
  end

  def f2
    puts "C::f2"
  end
end

c = C.new
c.f2

以上示例代码是我的问题的抽象。 Class C动态扩展module BB实际上已扩展为C的实例。来自f2的方法B无法满足我的需求,因此我想覆盖f2。如何实现?

1 个答案:

答案 0 :(得分:2)

我实际上不喜欢在initialize中延伸。以不同方式实现“插件”的原因有很多。 但是如果你想以这种方式“用脚射击”,那么,再做一次扩展:

module B
  def f2
    puts 'B::f2'
  end
end

class C
  attr_reader :parent_state

  def initialize
    extend B
    extend BOverrides

    @parent_state = 'Parent State'
  end

  module BOverrides
    def f2
      puts 'C::f2'
      puts 'Yes, I have access to %s' % parent_state
    end
  end
end

c = C.new
c.f2