Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

【C#入門】オブジェクト指向の『カプセル化』についてまとめた

$
0
0

この記事では、《オブジェクト指向の『カプセル化』》について、
業務を通して学習した内容を、備忘録としてまとめています。

  • 『カプセル化』とは…?
  • 『カプセル化』すると何がいいのか…?
  • フィールドの設定方法

こういった内容についてまとめています。

※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

【概要】 『カプセル化』 とは…?

capsule_1.jpg

クラス内のフィールド(メンバー変数)をprivateで宣言することで…

外部からの値の参照・変更を制限することができます。

変数を、クラスで包む、囲むイメージ。

『フィールド』とは・・・
クラスのメンバー変数として定義され、クラス内に直接書かれる変数のことで、フィールドと呼ばれます。
『フィールド』は、クラス内のメソッドから参照可能です。

例えば、下記のように記述します。

namespaceSample{publicclassProgram{privateint_num=0;publicProgram(intnum){_num=num;}}}

上記はコードは・・・

_num変数がprivateのフィールドで宣言されており、カプセル化されている状態です。

この_numを変更するためには…

コンストラクタでint型の値を指定することで、_numの初期値を変更することができます。

【メリット】 『カプセル化』 すると何がいいのか…?

list_2.jpg

  • コードが理解しやすく(読みやすく)なる
    • 値とロジックを1つにまとめることができる
  • 不正な値が設定されることを防げる
  • 保守性が高くなる

『カプセル化』をすると、外部からの値の参照・変更が制限されるため、宣言しているフィールドに設定される値は、必ず自分自身のクラスで設定する必要があります。

そのため・・・

そのフィールドにどういった値が設定されるかは、そのクラスを読むだけで理解できるようになります。

また・・・

外部からフィールドを設定することを許可してしまうと、意図していない(許可したくない)値が設定される可能性があります。

そこで・・・

『カプセル化』をすることで、不正な値が設定されることを、事前に防ぐことが可能です。

『カプセル化』したフィールドの設定方法|外部から変更する

capsule_2.jpg

繰り返しになりますが…

『カプセル化』をすることで、外部からの値の参照・変更を制限することができます。

ですが・・・

外部から値を設定できないので、クラスとしては機能しなくなります。

そのため・・・

何らかの方法で、外部からの値の変更を可能にする必要があります。

『カプセル化』されているフィールドの値を外部から変更する方法は…

  1. コンストラクタ
  2. プロパティ

を使った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では、プロパティのsetgetの中身を省略して記述できるようになりました。

ちなみに・・・

この機能を『自動プロパティ』と言います。

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;}}

Viewing all articles
Browse latest Browse all 9707

Trending Articles