public なメソッドを private でオーバーライドした場合

Java だと確か、アクセス制限を弱める方向でオーバーライドできた覚えがある。
PHPRuby で同じことを試す機会があったのでメモ。

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入門勉強ルーム

なるほどー。