C#を勉強していると、「クラス」「メソッド」「インスタンス」など色んな用語が出てきます。
今回は、オブジェクト指向でプログラミングする際に使える、「カプセル化」について事例も含めて紹介します。
メソッドやクラス、インスタンス・コンストラクタについてはこちらの記事を参考にしてください。
カプセル化とは
カプセル化とは、メンバ変数やメンバメソッドを他のクラスからアクセスできないようにすることです。
メソッドにアクセスするとき、アクセス修飾子をつけますが、それで調整することができます。
protected:自分のクラスまたは派生クラスからのみアクセス可能
private:自分のクラス以外からはアクセス不可能
前回の例でいうと、Murabito.csの変数にはpublicを設定していました。
ここをprivateに変更すると、「カプセル化した」ということになります。
なぜカプセル化をするのか?理由は2つあります。
2.クラスを使う人がメンバ変数におかしな値をいれないようにする
このように、見る必要のないものは隠し、使わせたいメンバだけにアクセスできるようにするのですね。これもプログラムをより正常に動かすための仕組みです。
アクセス修飾子のつけ方
アクセス修飾子はメンバ変数の宣言やメソッドの定義の手前につけます。
■Murabito.cs内で定義する変数をPrivateにするケース
Mainメソッドから呼び出されるMurabitoクラスで定義した変数をPublicからPrivateに変更しました。
■結果
パターン1はエラーにならないですが、パターン2では、"アクセスできない保護レベル"
というエラーメッセージが表示されます。
以上のように、呼び出し先のMurabito.csで変数をカプセル化(private)した場合、直接値を代入することができません。
一方で、引数で値を渡した場合は、publicなコンストラクタを利用しているので、値を渡すことができます。
メンバ変数にアクセスする方法
先ほどは、どのような値でも、hpの変数を代入できない保護レベルでしたが、正しい値は代入できるようにしたいですね。その場合は、メンバ変数に値を代入・取得するメンバメソッドを追加することで、対応できます。少しレベルアップした内容になりますが、紹介させていただきます。
■例題
<やりたいこと>
・Murabito1の体力を減らした値を現在のhpとして代入する
・マイナスの体力は0とする(マイナスの体力は入らないように)
<メンバメソッド>
・SetHpでは、渡した値をhpにセットするのですが、もしマイナスであれば0を代入しています。今回はマイナスになったNewHpを渡します。
・GetHpではHpを返します。SetHpでhpをマイナスから0にした値をGetHpで返します。
このようなメンバ変数にアクセスするメソッドをアクセサといいます。
アクセサで値の整合性をチェックすることで、メンバ変数におかしな数値が入ることを防ぎます(今回の例だと、変数hpにマイナスが入らないようにする)。
■Progmam.cs
■Murabito.cs
ひとこと
C#を初めて間もないころは、とりあえず他のソースを真似て、publicにしておこう、という方もいるかもしれません。ただ、意味を知ることで、他人のソースを読むときに「なぜPrivateにしたのか??」と意図がつかめるようになり楽しくなります(^^)この点、私には英語の文法を勉強している感覚と似ているな、と感じています。
今回の説明は「確かな力が身につくC# 「超」入門」を参考にさせていただきましたが(例題はオリジナルです)、「もっと前から読んでおきたかった!」と痛感しています、、。もし、C#について学び始めたという方は是非参考にしてみてください!(2020年7月に出版された新書です(^^)
次回は、先ほどの例題をさらに簡素にまとめるプロパティという仕組みについてご紹介いたします!