Rubyでは、オブジェクトのメンバに対するアクセス制御としてpublic、protected、privateを指定できる。Javaと同じキーワードであるが、protected、privateメソッドの挙動はJavaとはかなり違うので要注意だ。
- public どこからでも
- protected 同一パッケージとサブクラスから
- デフォルト 同一パッケージ内から
- private 同一クラス内からのみ
デフォルトよりアクセス範囲が広いJavaのprotectedというのも不気味だが、それは置いといて…
- 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へ続く