クラスメンバーのアクセス修飾子
C++ 2013/10/05
public
(構造体(struct
)のメンバでアクセス修飾子を指定しない場合のデフォルト)- クラスの外からでも可視
protected
- 同一クラスの中とそのクラスを継承する派生クラス(サブクラス)の中からのみ可視
private
(クラス(class
)のメンバーでアクセス修飾子を指定しない場合のデフォルト)- 同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。
Java 2013/12/14
public
- クラスの外からでも可視
protected
- クラスの中とそのクラスを継承するサブクラスの中、 および同一パッケージの中からのみ可視
- パッケージプライベート(アクセス修飾子を指定しない場合のデフォルト)
- 同一パッケージの中からのみ可視。 この可視性を指定するキーワードがなく明示的に指定する方法がない。
private
- 同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。
Scala 2013/11/06
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 2013/10/05
public
- クラスの外からでも可視
protected
- 同一クラスの中とそのクラスを継承するサブクラス、 そのクラスが継承した親クラスの中からのみ可視
private
(var
で定義したプロパティおよびなにも指定しなかったメソッドのデフォルト)- 同一クラスの中からのみ可視。同一クラスであれば他のインスタンスからもアクセス可能。
Ruby 2015/02/06
メソッドを定義するとデフォルトで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