クラスメンバーのアクセス修飾子

C++

public (構造体(struct)のメンバでアクセス修飾子を指定しない場合のデフォルト)
クラスの外からでも可視
protected
同一クラスの中とそのクラスを継承する派生クラス(サブクラス)の中からのみ可視
private (クラス(class)のメンバーでアクセス修飾子を指定しない場合のデフォルト)
同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。

Java

public
クラスの外からでも可視
protected
クラスの中とそのクラスを継承するサブクラスの中、 および同一パッケージの中からのみ可視
パッケージプライベート(アクセス修飾子を指定しない場合のデフォルト)
同一パッケージの中からのみ可視。 この可視性を指定するキーワードがなく明示的に指定する方法がない。
private
同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。

Scala

public (アクセス修飾子を指定しない場合のデフォルト)
どのクラス・パッケージからでも可視
protected
同じクラス/トレイトの中またはそのクラス/トレイトを継承しているサブクラスの 中からは可視。その中では他のインスタンスからのアクセスも可能。 Javaと違って同じパッケージの中でも継承関係がなければ可視にはならない。
protected[パッケージ名/クラス名]
同じクラス/トレイトの中またはそのクラス/トレイトを継承しているサブクラスの 中からは可視。その中では他のインスタンスからのアクセスも可能。 それ以外にもその指定のパッケージ/クラスからも可視。 Javaにはこの修飾子はない。
protected[this]
同じクラス/トレイトの中またはそのクラス/トレイトを継承しているサブクラスの 中からは可視。他のインスタンスからのアクセスは不可。 Javaにはこの修飾子はない。
private
同じクラス/トレイトの中からのみ可視。 同じクラス/トレイトの中では他のインスタンスからのアクセスも可能。
private[パッケージ名/クラス名]
同じクラス/トレイトの中からのみ可視。 同じクラス/トレイトの中では他のインスタンスからのアクセスも可能。 それ以外にもその指定のパッケージ/クラスからも可視。 Javaにはこの修飾子はない。
private[this]
同じクラス/トレイトの中からのみ可視。 同じクラス/トレイトの中でも他のインスタンスからのアクセスは不可。 Javaにはこの修飾子はない。

protected[パッケージ名/クラス名] または private[パッケージ名/クラス名] では、パッケージ名/クラス名にはドットを含むフルネームを書くことはできず、名前のみを書く。パッケージ名は階層の途中でもよく、例えば com.example.app1.foo というパッケージの中のクラスで、private[example] と書けば、com.example とそのサブクラスの中のどこからでもアクセスできる。

private[パッケージ名/クラス名] でパッケージ階層の途中ではなく末端のパッケージを指定すれば、Javaのパッケージプライベートと同じになる。

protected[パッケージ名/クラス名] やパッケージ階層の途中を指定した private[パッケージ名/クラス名] は、Javaにはない。

PHP

public
クラスの外からでも可視
protected
同一クラスの中とそのクラスを継承するサブクラス、 そのクラスが継承した親クラスの中からのみ可視
private (var で定義したプロパティおよびなにも指定しなかったメソッドのデフォルト)
同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。

Ruby

メソッドを定義するとデフォルトでpublicになる。メソッドをprivateやprotectedに変更するメソッドというのがあるので、それで定義したメソッドの可視性を変更する。

class FooClass
  
  def method1 # メソッド定義をするとデフォルトではpublic
    ...
  end
  
  # Module#private というメソッドにメソッド名をシンボルで渡すと、
  # そのメソッドをprivateにしてくれる
  private :method1 # この行は普通のメソッド呼び出し
  
  def method2
    ...
  end
  
  # protected も同様
  protected :method2
  
end

Javaなどのようにメソッド定義時に修飾子で可視性を定義するのとぜんぜん違い、いかにも動的な言語らしいやりかただが、Javaなどの方法に慣れている人にとっては気持ち悪い。

Ruby 2.1からは、メソッド定義がメソッド名のシンボルを返すようになるので、以下のように書ける。(未検証)

class FooClass
  
  private def method1
    ...
  end
  
end

この書き方でもメソッド定義後にprivateメソッドを呼び出してprivateに設定しているのだが、見た目はJavaみたいな感じになる。

Feature #3753: value of def-expr
https://bugs.ruby-lang.org/issues/3753

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。