我有以下课程
class Animal
def move
"I can move"
end
end
class Bird < Animal
def move
super + " by flying"
end
end
class Penguin < Bird
def move
#How can I call Animal move here
"I can move"+ ' by swimming'
end
end
如何在Penguin中调用Animal的移动方法?我不能使用super.super.move。有什么选择?
由于
答案 0 :(得分:8)
您可以获取move
的{{1}}实例方法,将其绑定到Animal
,然后调用它:
self
答案 1 :(得分:1)
class Penguin < Bird
def move
grandparent = self.class.superclass.superclass
meth = grandparent.instance_method(:move)
meth.bind(self).call + " by swimming"
end
end
puts Penguin.new.move
有关此方法的详细信息,请参阅this answer
答案 2 :(得分:1)
你可以这样做(我建议here):
class Penguin < Bird
def move
puts self.class.ancestors[2].instance_method(__method__).bind(self).call +
' by swimming'
end
end
Penguin.new.move
# I can move by swimming
[编辑:我认为这与@ August的回答非常相似。这有一个小优势,即类Animal
和方法名称move
都没有硬连线。]
答案 3 :(得分:1)
如果你使用的是Ruby 2.2.0,那么你的新版本就有了新功能。那个的东西是:Method#super_method
。
class Animal
def move
"I can move"
end
end
class Bird < Animal
def move
super + " by flying"
end
end
class Penguin < Bird
def move
method(__method__).super_method.super_method.call + ' by swimming'
end
end
Penguin.new.move # => "I can move by swimming"
我完全同意Robert Klemme's
,他的答案是最好和最干净的。