こんにちは、ゆたんぽです。
前回に引き続き、オブジェクト指向プログラミングに必要なカプセル化の概念を説明していきます。
C#におけるカプセル化は、プログラム内のデータを保護するための重要な概念の1つです。カプセル化により、プログラマーはデータを安全に隠蔽することができ、外部からの意図しない変更やアクセスを防ぐことができます。この記事では、C#におけるカプセル化の概念と、その実現方法について説明します。
カプセル化とは?
カプセル化とは、オブジェクト指向プログラミングにおいて、データやメソッドをクラス内に封じ込め、外部からのアクセスを制限することを指します。つまり、クラス外部から直接アクセスできないようにすることで、不正な操作や変更を防ぐことができます。
カプセル化は、オブジェクト指向プログラミングにおける重要な概念の1つであり、カプセル化されたデータは、データの安全性を高め、プログラムの信頼性を向上させます。
カプセル化の実現方法
C#におけるカプセル化は、主に2つの方法で実現されます。
アクセス修飾子による制限
C#には、public、private、protected、internalといったアクセス修飾子が用意されています。これらのアクセス修飾子を用いることで、クラス内のデータやメソッドへのアクセスを制限することができます。代表的なアクセス修飾子を以下に載せます。
- public:どのクラスからでもアクセス可能
- private:同じクラス内からのみアクセス可能
- protected:同じクラスと派生クラスからアクセス可能
- internal:同じアセンブリ内からのみアクセス可能
例えば、以下のようなPersonクラスがあった場合、Nameフィールドにはprivateアクセス修飾子を付けて、外部からの直接的なアクセスを制限しています。
public class Person
{
private string Name;
public void SetName(string name)
{
Name = name;
}
public string GetName()
{
return Name;
}
}
このように、SetNameを使用することでNameを変更できますが、直接Nameの値を変更することができない状態になりました。
よって、アクセス修飾子を使用することで、クラス内部で定義されたデータやメソッドに対して、外部からの不正なアクセスを制限することができます。
基本的にpublicを使用するとどこからもアクセスができてよいのですが、その分、自分でも不必要な変更を書けてしまうこともあります。そのため、praivateやinternalで設定しておき、必要な際にpublicにすることが良いと思います。
プロパティによる制御
C#には、プロパティという機能があり、このプロパティを利用することで、カプセル化を実現することもできます。プロパティは、オブジェクトの状態を取得・設定するためのアクセサメソッドです。プロパティを使用することで、クラス内部で保持されるデータに対して、制御されたアクセスを提供することができます。
例えば、以下のようにPersonクラスを定義し、Nameプロパティを使用することで、外部からの直接的なアクセスを制限することができます。
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
このように、プロパティを使用することで、クラス内部で保持されるデータに対して、制御されたアクセスを提供することができます。また、プロパティは、実際のデータを保護するために、バリデーションロジックを追加することができます。例えば、Nameプロパティに対して、以下のようなバリデーションロジックを追加することができます。
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("Name cannot be null or empty");
}
_name = value;
}
}
}
上記のようなプログラムを設定することで、Nameに値をセットする際に値が空(null)の状態を確認し、空だったらエラーを出して、それ以外は値をセットするというロジックを組むことができます。
今回は、空の確認でしたが、例えば、「大文字だけ入れたい」や「ひらがなだけ入れたい」など、自分が制限したいことを簡単に実現できます。
このように、プロパティを使用することで、データを保護するだけでなく、バリデーションロジックを追加することもできます。
まとめ
C#におけるカプセル化は、プログラム内のデータを保護するための重要な概念であり、アクセス修飾子やプロパティを使用して実現されます。カプセル化により、プログラマーはデータを安全に隠蔽することができ、外部からの意図しない変更やアクセスを防ぐことができます。カプセル化は、オブジェクト指向プログラミングにおいて重要な概念であるため、しっかりと理解しておくことが大切です。