如何在ruby中修补继承的钩子?

时间:2013-06-19 20:07:53

标签: ruby

只是一个简单的例子。

class Base
  def self.inherited(child)
    p 'Base.inherited'
  end
end

class User < Base
  p 'User'
end

这让我产生了

"Base.inherited"
"User"

这很好但是如何修补Base类的inherited钩子?

假设我希望我的结果是

"Base.inherited"
"Something inherited"
"User"

仍然让我的User类继承Base。

任何想法,解决方法?

谢谢!


更新问题更具体。

我需要在类User继承Base而不修改User类时完全运行一些代码。

假设我的Base类有定义的inherited方法。从一方面我不知道其他类将继承Base。另一方面,我无法修改Base类的原始inherited方法。

那么如何修补该方法?

谢谢!

2 个答案:

答案 0 :(得分:4)

module Foo
  def self.included(child)
    p "Something inherited"
  end
end

class Base
  def self.inherited(child)
    p 'Base.inherited'
  end
end

class User < Base
    include Foo
    p 'User'
end

# >> "Base.inherited"
# >> "Something inherited"
# >> "User"

答案 1 :(得分:1)

找到答案。

在这种情况下,别名链接工作正常。出于某种原因,我认为它适用于常用方法,但不适用于ruby回调。

class Base
  def self.inherited(child)
    p 'Base.inherited'
  end
end

Base.class_eval do
  class << self
    alias_method :chained_inherited, :inherited

    def inherited(child)
      chained_inherited(child)
      p 'Inherited'
    end
  end
end

class User < Base
  p 'User'
end

# => "Base.inherited"
# => "Inherited"
# => "User"