アクセス修飾子は、C++ のコンパイル時のメカニズムにすぎません。ただし、Java では、Java にも実行時型システムがあり、動的に (実行時に) クラスを作成できるため、これらは実行時にも適用されます。そのため、コンパイル時にわからない型に対しても、実行時にアクセスを強制する必要があります。
アクセス修飾子を使用する理由
アクセス修飾子の唯一の目的は、設計を強化することです。
A
実装したクラスがあるとします
class A
{
public:
void DoSomething()
{
// use private member mPrivMember to do something
}
private:
int mPrivMember;
}
そして class を使ったいくつかのコードA
:
A a_obj;
上記のコードは を呼び出すことができますがa_obj.DoSomething()
、mPrivMember に直接アクセスできないため、a.mPrivMember
クラス外に記述したA
場合はコンパイルされません。
では、外部コードからアクセスできるメンバーとそうでないメンバーが必要なのはなぜでしょうか。その理由は次のとおりです。現時点では、メソッドDoSomething()
はmPrivMember
実際に何かを行うために使用されます。しかし、しばらくすると、DoSomething のコードをリファクタリングして改善したいと思うかもしれません。もう使用する必要のない何かを行う別の方法を見つけましたmPrivMember
。したがって、他の方法で削除mPrivMember
して再実装します。DoSomething
を使用してクラス外にコードがあった場合、 を再実装するときmPrivMember
に削除したため、そのコードはコンパイルされなくなります。このようなコードの存在を防ぐには、へのアクセスを制限します。これを行うメカニズムは、やなどのアクセス修飾子を使用することです。mPrivMember
DoSomething
mPrivMember
private
protected
これにより、他のコードが内部メンバーを使用する可能性を心配することなく、将来コードをリファクタリングできます。
要約
public
private
およびprotected
C++ のコンパイル時のメカニズムです。それらはプログラムの生成されたバイナリ形式には存在しないため、そのような保護は適用されません。どこからでも何でもアクセスできます。
ただし、Java では、私が間違っていなければ、実行時にクラスを作成できます。Private
Public
これが、実行時にもアクセスをチェックして強制できるようにする必要がある理由でありProtected
、Java バイナリに存在します。