Techioz Blog

Ruby: 継承不可能なクラスメソッドを作成する

概要

クラスがあるとしましょう:

class Person
  def self.say
    puts "hello"
  end
end

そしてサブクラス:

  class Woman < Person
  end

「say」メソッドをパブリック メソッドにしたいのですが、「Woman」または他のサブクラスに継承されたくありません。それを達成するための正しい方法は何でしょうか?

解決策

その静的メソッドを別の場所、たとえばモジュール内に定義します。

module Person

  class Base
  end

  class Woman < Base
  end

  def self.create(name)
    case name
    when :woman
      Woman.new
    end
  end

end

Person.create(:woman)          # => #<Person::Woman:0x007fe5040619e0>
Person::Woman.create(:woman)   # => undefined method `create' for Person::Woman:Class