有可能实现alias_method(或alias_method_chain):
module ChildMod1 def save puts "save ChildMod1" super endendmodule ChildMod2 def save puts "save ChildMod2" super endendclass Parent def save puts "save Parent" endendclass Child < Parent include ChildMod1 include ChildMod2 def save puts "save Child" super end alias_method :old_save,:save module_eval <<-R def save puts "save Callback" old_save end Rendc = Child.newc.save
产量
save Callbacksave Childsave ChildMod2save ChildMod1save Parent
但是有可能通过继承实现这一目标吗?比如ChildMod1或ChildMod2.我想在模块空间中执行代码以从继承中获得所有好处
module ChildMod1 def save puts "save ChildMod1" super endendmodule ChildMod2 def save puts "save ChildMod2" super endendclass Parent def save puts "save Parent" endendclass Child < Parent include ChildMod1 include ChildMod2 def save puts "save Child" super end module_eval <<-R def save puts "save Callback" super end Rendc = Child.newc.save
产量
save Callbacksave ChildMod2save ChildMod1save Parent
如你所见,它只是覆盖了Child
UPDATE
wdebeaum解决方案很好,但是如果我需要创建很多方法动态地想到module_eval或analog并在类中重新定义它们呢?我无法为它们创建单独的模块.
class TestEval def redefine_me puts "Test method" super # I expect that it will call Eval method,but module_eval just overwrite it end module_eval <<-R def redefine_me puts "Eval method" end Rend
UPDATE2
使用单例类我会得到错误的链Eval =>测试代替Test => EVAL
class TestEval def initialize class << self def redefine_me puts "Eval method" super end end end def redefine_me puts "Test method" endendTestEval.new.redefine_me
假设我有一个类方法“fIEld”,它将一些实例方法添加到Datastream中(前者它将添加setter和getter方法)并且我想重新定义其中一个方法,如下所示:
class Datastream fIEld :name def name=(value) puts "redefined!" super end end解决方法 您可以将回调方法放在其自己的模块中,并重写Parent的initialize方法以扩展该模块(如果需要,使用alias_method).这将把回调方法放在Child的方法之前,将它链接到每个Child实例的单例类.只需从第二个代码示例中删除module_eval部分,然后在c = Child.new之前添加:
module Callback def save puts "save Callback" super endendclass Parent alias_method :old_initialize,:initialize def initialize old_initialize extend Callback endend
输出:
save Callbacksave Childsave ChildMod2save ChildMod1save Parent总结
以上是内存溢出为你收集整理的ruby混合和遗传注射全部内容,希望文章能够帮你解决ruby混合和遗传注射所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)