あおきです。

  In mail "[ruby-list:18807] protected なメソッドの再定義"
    YAMASHITA Junji (山下 純司) <ys_jyunji / teleweb.or.jp> wrote:

> 山下 純司です。
> 
> Ruby本の p.190 には
> 
>    protected メソッドをサブクラスで再定義することは、
>    ほとんどの場合に望ましくない結果になる
> 
> という記述があるのですが、この「望ましくない結果」とはどのような
> ものなのでしょうか?
> 
> 直前に理由が書かれていますが、いまいち分かりません。
> 
> お手数ですが、どなたか例を示していただけないでしょうか?

たとえば、

class A
  protected
  def secret
    'MS が Linux 2001 上で動く Visual R++ を出すらしい'
  end
end

class B < A
  def print_secret
    print secret
  end
end

というふたつのクラスがある場合、メソッド secret はクラス A と
その子供たちだけの秘密にしたいわけです。ところが、子供 B は
もっとすごい秘密を見つけたので secret の中身を変えたいと思います。
しかし、次のように直接 secret を再定義してしまうと

class B < A
  protected
  def secret
    # もっといい秘密
  end
end

B#secret は 「B とその下位クラス」からしか呼べなくなってしまいます。
つまり、A から呼べなくなってしまいます。これでは親不幸です。
ということで、通常は次のようにします。

class A
  protected
  def secret
    do_secret
  end

  private
  def do_secret
    'MSがLinux2001上で動くVisual R++を出すらしい'
  end
end

class B < A
  private
  def do_secret
    %(RedHat7.0ではデフォルトでRubyがインストールされるらしい
      Debian3.0ではRubyでパッケージを管理するそうだ
      Perl6はRubyで書かれている
      Windows2000のバグでMSのプログラムは全部消滅したって?
      SunはJavaを捨ててRubyに移行するようだ
      Ruby本全国書籍売りあげランキング13位 :-)
  end
end

これで、secret は A からも B からも呼べるけどアカの他クラスからは
呼べなくなり、B は秘密をもっとすてきな内容に変えられるわけです。

という感じでどうでしょうか?
-------------------------------------------------------------------
あおきみねろう