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

Rubyでは、オブジェクトのメンバに対するアクセス制御としてpublic、protected、privateを指定できる。Javaと同じキーワードであるが、protected、privateメソッドの挙動はJavaとはかなり違うので要注意だ。

Java

  • public どこからでも
  • protected 同一パッケージとサブクラスから
  • デフォルト 同一パッケージ内から
  • private 同一クラス内からのみ

デフォルトよりアクセス範囲が広いJavaのprotectedというのも不気味だが、それは置いといて…

Ruby

  • public どこからでも
  • protected 同一クラスとサブクラスから
  • private レシーバを記述してアクセスできない

Rubyではデフォルトがpublicである。また、Rubyでは、private等のキーワードはメンバへの修飾子ではなく、「ここから先で定義するメソッドはprivateにする」という意味なので注意。Rubyでは、これらのキーワードも実はメソッドである。

レシーバを記述してアクセスできないというのは

class Hoge
    def public_method
        private_method()         # OK
        self.private_method()    # だめ    
    end

    private 
    def private_method
    end
end

結果的に、Rubyのprivateメソッドは同一インスタンス内からの呼び出しのみが可能になる。また、サブクラスのインスタンスでも、親クラスのprivateメソッドにアクセス可能である。(サブクラスのインスタンスからの親のメソッド呼び出しは、同一のインスタンス内からのアクセスと言える)

class Fuga
    private
    def private_method
    end
end

class Fugafuga < Fuga
    def public_method
        private_method()        #親クラスのprivateも呼べる
    end
end

2へ続く