RubyのprotectedはJavaやC++とは違うことは、意外と知られていないようです。
Ruby の protected は Java, C++ とは意味が違います。 Ruby の protected を使うと、サブクラスのインスタンスが「オブジェクトの外から」メソッドを呼べるようになります。
ということで、例として次のコードが示されています。
class A
def m
puts "OK"
end
protected :m
def call_m(a)
a.m
end
end
A.new.call_m(A.new) # これは大丈夫
A.new.m # これはダメ
このコードを見ると一目瞭然ですね。
参考
- Rubyリファレンスマニュアル – クラス/メソッドの定義 「呼び出し制限」
- Rubyリファレンスマニュアル – FAQ::メソッド 「5.5 privateとprotectedの違いが分かりません」
追記
ちなみに、privateもJavaやC++とは意味が違います。
Rubyでは関数形式(レシーバを省略した形)でしか呼び出すことのできないメソッドのことをprivateなメソッドと呼んでいます。C++やJavaのprivateとは意味が違うので注意してください。
ということで、Rubyではprivateに指定したメソッドをサブクラスから呼び出すことができます。
フレームワークを使っていると、知らないうちに基底クラスのメソッドをオーバーライドしてしまい、予期せぬバグに悩まされたりします。