著作一覧 |
class Foo protected def foo() puts 'foo' end end class Bar < Foo def foo() puts 'bar' end end x = Bar.new x.foo
上のプログラムは動く(1.8.7、1.9.1とも)。ということは、protectedは継承クラスでは維持されないということなんだろう。
そこで次のように変えてみる。
class Foo protected def foo() puts 'foo' end end class Bar < Foo protected # 追加 def foo() puts 'bar' end end x = Bar.new x.foo
確かに、そうであって欲しい動作を得られる。
C:\temp>ruby -v protected.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] protected.rb:15: protected method `foo' called for #<+Bar:0x27af420> (NoMethodError) or)
そこでメソッドbooをFooに追加する。
class Foo def boo(f) f.foo # 別のインスタンスのfooを呼ぶ end protected def foo() puts 'foo' end end class Bar < Foo protected def foo() puts 'bar' end end x = Foo.new x.boo(Foo.new) x.boo(Bar.new)
実行する。
C:\temp>ruby -v protected.rb ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32] foo …… OK protected.rb:3:in `boo': protected method `foo' called for #<Bar:0x1b77504> (NoMethodError) from protected.rb:19:in `<main>'
うーむ。どうしろと。最初の例から、protectedは継承されないから継承クラスでprotectedを付けた。しかし、そうすると継承元クラスからの呼び出しもできなくなる。しかしレシーバを指定したいからprivateではなくprotectedにしているのだから、これはどちらかがおかしくはないか(というよりも、継承先で呼び出しが可能なメソッドをprotectedと称するということなんだろうなぁ、きっと)。
おれにとっては、継承先にprotectedが引き継がれることが自然だと思うが、Rubyの考え方ではかくあるのだろう。
ジェズイットを見習え |