只是一个简单的例子。
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
方法。
那么如何修补该方法?
谢谢!
答案 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"