繁体   English   中英

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

[英]How can I patch the inherited hook in 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方法。

那么如何修补该方法呢?

谢谢!

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"

找到了答案。

在这种情况下,别名链接工作正常。 出于某种原因,我认为它适用于常用方法,但不适用于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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM