用扭曲调用超类的方法

时间:2010-10-20 15:01:33

标签: ruby

假设我有两个类似的那样:

class Parent
  def say
   "I am a parent"
  end
end

class Child < Parent
  def say
   "I am a child"
  end

  def super_say
   #I want to call Parent.new#say method here
  end
end

有什么选择呢?我想到了:

def super_say
  self.superclass.new.say #obviously the most straight forward way, but inefficient
end

def super_say
 m = self.superclass.instance_method(:say)
 m = m.bind(self)
 m.call
 #this works, but it's quite verbose, is it even idiomatic? 
end

我正在寻找一种不涉及别名的方式Parent.new#say to other else,这会使它在方法查找链中独一无二(或者这实际上是首选方式?)。 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我倾向于使用别名。 (我不太确定我理解你的反对意见。)

示例:

class Child < Parent
  alias :super_say :say

  def say
    "I am a child"
  end
end

给出:

irb(main):020:0> c = Child.new
=> #<Child:0x45be40c>
irb(main):021:0> c.super_say
=> "I am a parent"

答案 1 :(得分:0)

你的第二个解决方案(bind())是我想要的。它是冗长的,因为你正在做的事情是非常不寻常的,但如果你真的需要这样做 - 这个解决方案对我来说似乎很好。