最近気づいた継承と mixin の違い

最近気づいたんですが、

  • 継承したスーパークラスのクラスメソッドをサブクラスから呼べる
  • mixin したモジュールのクラスメソッドは呼べない

っていう違いがあるんですね。

class Super
  def self.super_class_method
    "Super#super_class_method"
  end

  def super_instance_method
    "Super#super_instance_method"
  end
end

module M
  def self.module_class_method
    "M#module_class_method"
  end

  def module_instance_method
    "M#module_instance_method"
  end
end

class Sub < Super
  include M
  extend M

  # スーパークラスのクラスメソッドは呼べる
  pp super_class_method
  # mixin したモジュールのクラスメソッドは呼べない
  # pp module_class_method

  def sub_instance_method
    # インスタンスメソッドはどっちからでも呼べる
    pp super_instance_method
    pp module_instance_method
  end
end

Sub.new.sub_instance_method

あんまり Ruby で継承するってことはやらないのでスーパークラスのクラスメソッドをサブクラスから呼べるのは知らなかった。