staticメソッド内からのprotectedの呼び出し -ruby編-

「Aを継承したBのstaticメソッドからAのprotectedメソッドを呼びたい場合。」のruby版。
rubyで静的メソッドの宣言がわからなかったので、そこから。

rubyでのstatic = クラスメソッド(特異メソッド)

class hoge
  def self.foo
    # hogehoge
  end
end

hoge.foo # =>インスタンスなしで呼び出し可

C#と同じように書いてみる

エラーになった。インスタンスの外側からはアクセスできないらしい。

どうすればメソッドを呼べる?

protectedメソッドを呼ぶためのpublicメソッドを定義して、それを呼ぶ。

class A
  def foo
    puts "foo"
  end
  protected :foo
end

class B < A
  def self.bar
    B.new.hoge
  end
  def hoge
    self.foo
  end
end

B.bar # => "foo"

いやちょっと・・・

確かに目的は果たせたが・・・
せっかくprotectedで隠蔽してるのに、publicにしてしまうメソッドを作っていいのだろうか?

結局は

呼ばれたくないからprotectedにしている。
インスタンスの外から使いたいなら、最初からpublicにするなりクラス設計見直すなりしろと。