superは継承だけではなく、include, extendしたメソッドをオーバーライドした場合にも使えるということを知らなかったのでメモ。
ちなみにどのパターンもsuperを明示的に呼び出さなければ単なるメソッドの上書きになる。(PopCorn!!は出力されない)
super_include.rb
#!/usr/bin/env ruby
module Corn
def pop
puts 'PopCorn!!'
end
end
class Caramel
include Corn
def pop
super
puts 'PopCaramelCorn!!'
end
end
c = Caramel.new
c.pop
% ruby super_include.rb
PopCorn!!
PopCaramelCorn!!
super_extend.rb
#!/usr/bin/env ruby
module Corn
def pop
puts 'PopCorn!!'
end
end
class Caramel
extend Corn
def self.pop
super
puts 'PopCaramelCorn!!'
end
end
Caramel.pop
% ruby super_extend.rb
PopCorn!!
PopCaramelCorn!!
super_succeed.rb
#!/usr/bin/env ruby
class Corn
def pop
puts 'PopCorn!!'
end
end
class Caramel < Corn
def pop
super
puts 'PopCaramelCorn!!'
end
end
c = Caramel.new
c.pop
% ruby super_succeed.rb
PopCorn!!
PopCaramelCorn!!
実行環境
% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]