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