インスタンスメソッドのアクセス制限2

Rubyのマニュアルには「privateは自クラス及びサブクラスからしか参照できません。」とあるが、正確には、自インスタンスの内部からしか参照できないような感じ。

Javaでは、同一クラスであれば別のインスタンスのprivateメソッドも呼べるのであるが…

public class Hoge {
    public void publicMethod(Hoge hoge) {
        // 別のインスタンスでも、同一クラス内なのでprotectedは呼べる
        hoge.protectedMethod();

        // 別インスタンスのprivateメソッドも呼べる
        hoge.privateMethod();    
    }
    
    protected void protectedMethod() {
    }

    private void privateMethod() {
    }
}

Rubyでは別インスタンスのprivateメソッドは呼ぶ事は出来ない。

class Hoge
    def public_method(hoge)
        # 同一のクラスであれば、protectedメソッドは呼べるが…
        hoge.protected_method
        
        # privateメソッドはレシーバを指定できないので呼べない
        hoge.private_method()    # だめ    
    end

    protected 
    def protected_method
    end

    private 
    def private_method
    end
end

まとめ、Rubyのアクセス修飾子は、

  • public どこからでも呼べるメソッド
  • protected クラス内(サブクラス含む)から呼べるメソッド
  • private 同一インスタンス内(サブクラスのインスタンスを含む)から呼べるメソッド