public なメソッドを private でオーバーライドした場合
Java だと確か、アクセス制限を弱める方向でオーバーライドできた覚えがある。
PHP と Ruby で同じことを試す機会があったのでメモ。
PHP の場合
Error になる。public なメソッドは public でないといけないらしい。
Java と似た方式。
<?php class AbsTest { public function foo() { echo "foo"; } } class Test extends AbsTest { private function foo() { echo "foo!"; } public function bar() { self::foo(); } } $a = new Test(); $a->bar(); // Fatal error: Access level to Test::foo() must be public (as in class AbsTest)
Ruby の場合
アクセスを厳しくしてもOK。
#!/usr/bin/env ruby #-*- coding:utf-8 -*- class AbsTest def foo puts "foo" end end class Test < AbsTest def bar foo end private def foo puts "bar!" end end a = Test.new a.bar #=> bar!
ちなみに Ruby のアクセス修飾子について
ちょっと調べてみたら、Ruby のアクセス制限はちょっと変わってるようだ。
以下引用。
public
そのメソッドが定義されたクラス内、サブクラス、クラス外(インスタンス)のどこからでもアクセス可能です。
private
メソッドは、クラスの内部(定義クラスとサブクラス)からのみアクセス可能。
レシーバを指定して呼び出すのは不可で、クラス内部からでもインスタンスメソッドとしては使えない。protected
メソッドは、クラスの内部(定義クラスとサブクラス)からのみアクセス可能。
レシーバを指定して呼び出すことができ、クラス内部からであればインスタンスメソッドとして使える。
クラス定義でメソッドへのアクセス制限・public, private, protected by Ruby入門勉強ルーム
なるほどー。