Rubyのprotectedは、JavaやC++とは違う

RubyのprotectedはJavaやC++とは違うことは、意外と知られていないようです。

Ruby の protected は Java, C++ とは意味が違います。 Ruby の protected を使うと、サブクラスのインスタンスが「オブジェクトの外から」メソッドを呼べるようになります。

Rubyist Magazine – あなたの Ruby コードを添削します 【第 3 回】 dbf.rb

ということで、例として次のコードが示されています。

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               # これはダメ

このコードを見ると一目瞭然ですね。

参考

追記

ちなみに、privateもJavaやC++とは意味が違います。

Rubyでは関数形式(レシーバを省略した形)でしか呼び出すことのできないメソッドのことをprivateなメソッドと呼んでいます。C++やJavaのprivateとは意味が違うので注意してください。

Rubyリファレンスマニュアル – FAQ::メソッド

ということで、Rubyではprivateに指定したメソッドをサブクラスから呼び出すことができます。

フレームワークを使っていると、知らないうちに基底クラスのメソッドをオーバーライドしてしまい、予期せぬバグに悩まされたりします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です