« 最近描いた絵いろいろ | メイン | ブログの目次を更新しました »

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に指定したメソッドをサブクラスから呼び出すことができます。

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

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/398

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2007年06月14日 22:53に投稿されたエントリーのページです。

ひとつ前の投稿は「最近描いた絵いろいろ」です。

次の投稿は「ブログの目次を更新しました」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35