ruby self.inherited alias_method

时间:2017-02-03 10:51:31

标签: ruby-on-rails ruby inheritance alias-method

class Base
  def sam
    "I m the base"
  end

  def self.inherited(base)
    alias_method :old_sam, :sam
    base.class_eval do
      def sam
        old_sam 
        p "Inside inherited"
      end
    end
    super
  end
end

class Derived < Base
  def sam
   p "Inside Derived"
  end
end

当Derived.new.sam =&gt; “内在衍生”

但我希望

“内部衍生”

“内部继承”

红宝石新手。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您只需覆盖base.class_evalsam方法Derived定义的内容。

如果您从sam删除方法Derived

class Derived < Base
end

你会得到:

#=> "Inside inherited"
#=> ArgumentError: wrong number of arguments (given 1, expected 0)

后者是因为你将一个参数传递给old_sam方法,它不接受它:

old_sam p "Inside inherited"
  

但我希望

     

&#34;内部衍生&#34;

     

&#34;内部继承&#34;

这对您的设置是不可能的,因为您要做的是首先在sam块中为所有降序类定义实例方法class_eval,但稍后只是覆盖。