あおきです。
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 は秘密をもっとすてきな内容に変えられるわけです。
という感じでどうでしょうか?
-------------------------------------------------------------------
あおきみねろう