この記事では、《オブジェクト指向の『カプセル化』》について、
業務を通して学習した内容を、備忘録としてまとめています。
- 『カプセル化』とは…?
- 『カプセル化』すると何がいいのか…?
- フィールドの設定方法
こういった内容についてまとめています。
※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。
【概要】 『カプセル化』 とは…?
クラス内のフィールド(メンバー変数)をprivateで宣言することで…
外部からの値の参照・変更を制限することができます。
変数を、クラスで包む、囲むイメージ。
『フィールド』とは・・・
クラスのメンバー変数として定義され、クラス内に直接書かれる変数のことで、フィールドと呼ばれます。
『フィールド』は、クラス内のメソッドから参照可能です。
例えば、下記のように記述します。
namespaceSample{publicclassProgram{privateint_num=0;publicProgram(intnum){_num=num;}}}上記はコードは・・・
_num変数がprivateのフィールドで宣言されており、カプセル化されている状態です。
この_numを変更するためには…
コンストラクタでint型の値を指定することで、_numの初期値を変更することができます。
【メリット】 『カプセル化』 すると何がいいのか…?
- コードが理解しやすく(読みやすく)なる
- 値とロジックを1つにまとめることができる
- 不正な値が設定されることを防げる
- 保守性が高くなる
『カプセル化』をすると、外部からの値の参照・変更が制限されるため、宣言しているフィールドに設定される値は、必ず自分自身のクラスで設定する必要があります。
そのため・・・
そのフィールドにどういった値が設定されるかは、そのクラスを読むだけで理解できるようになります。
また・・・
外部からフィールドを設定することを許可してしまうと、意図していない(許可したくない)値が設定される可能性があります。
そこで・・・
『カプセル化』をすることで、不正な値が設定されることを、事前に防ぐことが可能です。
『カプセル化』したフィールドの設定方法|外部から変更する
繰り返しになりますが…
『カプセル化』をすることで、外部からの値の参照・変更を制限することができます。
ですが・・・
外部から値を設定できないので、クラスとしては機能しなくなります。
そのため・・・
何らかの方法で、外部からの値の変更を可能にする必要があります。
『カプセル化』されているフィールドの値を外部から変更する方法は…
- コンストラクタ
- プロパティ
を使った2つの方法があります。
方法①: コンストラクタ
先ほど少し紹介しましたが…
コンストラクタでフィールドのの初期値を変更することができます。
namespaceSample{publicclassProgram{privateint_num=0;publicProgram(intnum){_num=num;}}}上記はコードは・・・
_num変数がprivateのフィールドで宣言されており、カプセル化されている状態です。
この_numを変更するために…
コンストラクタでint型の値を指定することで、_numの初期値を変更しています。
方法②: プロパティ
値を設定するメソッドを公開する。
コンストラクタで設定する方法は、クラスを生成するときにしか動作しないため、初期値しか指定することができません。
生成後に値を変更したくても、コンストラクタだけでは対応できません。
そこで・・・
値を変更することのできるメソッドを公開するやり方があります。
namespaceSample{publicclassProgram{privateint_num=0;publicintNum{set{_num=value;}//値の代入get{return_num;}//外部に値を返す}}}set{}の中には…
フィールド(メンバー変数)=valueというように記述します。
valueは、利用者側のクラスで代入された値が格納される『予約語』になります。
また・・・
get{}の中には…
returnフィールド(メンバー変数)というように、戻り値を記述します。
【補足】 C#3.0での書き方
C#3.0では、プロパティのset、getの中身を省略して記述できるようになりました。
ちなみに・・・
この機能を『自動プロパティ』と言います。
namespaceSample{publicclassProgram{privateint_num=0;publicintNum{set;get;}}}【補足】 C#6.0での書き方
C#6.0では、初期値を指定できるようになりました。
publicintNum{get;set;}=100ちなみに・・・
上記のコードは、以下と同様になります。
privateint_num=100;publicintNum{set{_num=value;}get{return_num;}}

