4

只是一个简单的例子。

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

class User < Base
  p 'User'
end

这产生了我

"Base.inherited"
"User"

这工作正常,但我怎样才能修补inherited基类的钩子?

假设我希望我的结果是

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

并且仍然让我的 User 类继承 Base。

任何想法,解决方法?

谢谢!


更新问题更具体。

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

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

那么我该如何修补该方法呢?

谢谢!

4

2 回答 2

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"
于 2013-06-19T20:19:35.653 回答
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"
于 2013-06-22T07:01:13.687 回答