アクセス修飾子とは
クラス(基本@)のサンプルコードにこんなのがありました。
クラスの例class sentouki { public int x; public int y; public void moveleft() { x -= 1; } public void moveright() { x += 1; } public void moveup() { y -= 1; } public void movedown() { y += 1; } } |
メンバの宣言(定義)前についてる「public」というのがアクセス修飾子です。アクセス修飾子の役割は、そのメンバがどこまで参照可能なのかを示しています。「public」は、このメンバがクラスの外から参照できることを表しています。つまり…
インスタンスの使用sentouki jet = new sentouki(); int x,y; jet.x = 100; jet.y = 100; x = jet.x; y = jet.y; jet.moveleft(); jet.moveright(); jet.moveup(); jet.movedown(); |
と、生成したインスタンスのメンバとしてアクセスできることを表しています。実は、publicがないとこのようなメンバへのアクセスが出来ないのです。
重要なアクセス修飾子
C#には、そのメンバがどこまで公開されているのかを示すアクセス修飾子がいくらかあります。その中でも、よく使う3つのアクセス修飾子を紹介します。
アクセス修飾詞 | 意味 |
---|---|
public | 外部からのアクセスを許可します |
protected | 同じクラスと派生クラスのメンバからのアクセスを許可します |
private | 同じクラスのメンバからのアクセスのみを許可します。 |
「public」メンバは、どこからでもアクセスが可能です。「インスタンス.メンバ」と生成したメンバからアクセスしたい場合はこの修飾子を選びます。それに対し、「protected」と「private」は関係のあるクラス内からしかアクセスできないため、インスタンスの外側からは参照できなくなります。ちなみに、何も書かない場合はprivateになります。継承@の例を使って図で表してみるとこんな感じです。
「Player p = new Player();」とインスタンスを生成した場合、p.〜とアクセスできるのは「KeyControl()」と「OnDraw()」メソッドの2つのみになります。KeyControlメソッドの中からは、「Move()」と「Shot()」を呼ぶことが出来ます(もちろんOnDraw()も)が、CombatのX,Yを呼ぶことは出来ません。このように、アクセス修飾子をつかって、そのメンバがどこまでアクセスできるかを細かく設定することが出来ます。
なぜ、private・protectedが必要なのか
例えば、上の例で、インスタンスpのXやYの値を変えたい場合はどうすればいいのでしょうか。X、Yがprivateになっているため、「p.X = 0;」のように外部からアクセスできません。そこで、MoveメソッドにX,Yの値を変更するコードを書いておきます。さらに、KeyControl()内でMove()メソッドを呼び出してやれば「p.KeyControl();」で、移動が出来ます。このように、アクセス修飾子を使ってある値にアクセスする方法を制限し、通り道を一本化することが出来ます。
アクセス修飾子の機能は分かっていただけたと思いますが、この説明では必要性が感じられないと思います。当然のことながら、全部publicにしておけば、プログラムは動きます。とりあえず全てpublicにしておけば問題ないでしょう。なぜ、わざわざアクセスの方法を制限をしなくてはいけないのでしょうか。例えば、X,Yの値が「0以上100以下」を超えないように処理をしたい場合、その処理をMove()に書いておけばいいでしょう。しかし、もしX,Yがpublicだった場合に「p.X = 200;」とやられては全く意味がありません。このように、値を勝手にいじられては困る場合にアクセスを制限するといいことがあります。
まとめ
アクセス修飾子の意味自体は、非常に簡単なものです。ですが、その使いどころは結構難しかったりします。クラスの使い方に約束を決める機能だと思うといいでしょうか。コードが長くなってプログラムがぐちゃぐちゃにならないようにうまくアクセスを制限できると、プログラムの構造をすっきりとまとめることができます。
次回は継承の話に戻って、オーバーライドとポリモーフィズムの話をします。今回よりは、便利に感じていただけると思います。