ruby混合和遗传注射

ruby混合和遗传注射,第1张

概述我需要在Parent类的每个子类中注入一个回调.因此,必须先调用带回调的方法,然后调用所有存在的链: 有可能实现alias_method(或alias_method_chain): module ChildMod1 def save puts "save ChildMod1" super endendmodule ChildMod2 def save pu 我需要在Parent类的每个子类中注入一个回调.因此,必须先调用带回调的方法,然后调用所有存在的链:

有可能实现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混合和遗传注射所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存