やりたいこと
子クラスのメソッド bar から親クラスのメソッド foo を呼びたい。
オーバーライドしたメソッドではないので super
が使えない。
class Parent
def foo
puts 'parent'
end
end
class Child < Parent
def foo
puts 'child'
end
def bar
# ここで親の #foo を呼びたい
end
end
alias を使う
上書きする前に alias しておけばよい
class Parent
def foo
puts 'parent'
end
end
class Child < Parent
alias :super_foo :foo
def foo
puts 'child'
end
def bar
super_foo #=> parent
end
end
self.class.superclass からメソッドを取り出して bind して使う
これでもできる
class Parent
def foo
puts 'parent'
end
end
class Child < Parent
def super_foo(*args, &blk)
self.class.superclass.instance_method(:foo).bind(self).call(*args, &blk)
end
def foo
puts 'child'
end
def bar
super_foo #=> parent
end
end
super_method を使う (Ruby >= 2.2)
コメントより(thanks!)。Ruby >= 2.2 なら super_method を利用できる。
class Parent
def foo
puts 'parent'
end
end
class Child < Parent
def foo
puts 'child'
end
def bar
public_method(:foo).super_method.call #=> parent
end
end