『Unity C#基礎』 第九回: クラスの詳細とデータのカプセル化
この記事では、クラスの詳細な使い方と、データのカプセル化について学びます。これにより、オブジェクト指向プログラミングの理解を深め、より堅牢で再利用可能なコードを書くことができるようになります。
クラスの詳細
クラスは、オブジェクトの属性や動作を定義するための中心的な構造です。以下のポイントに注意して、クラスをより効果的に使用しましょう。
プロパティのアクセサ
プロパティに対して、データの取得と設定を行うためのアクセサ(getterとsetter)を使用することで、データの管理が容易になります。これにより、内部データの整合性を保つことができます。
public class Player
{
private int health;
public int Health
{
get { return health; }
set
{
if (value < 0)
{
health = 0; // 健康が負になることを防ぐ
}
else
{
health = value;
}
}
}
public Player(int initialHealth)
{
Health = initialHealth;
}
}
この例では、Healthプロパティに対するsetterを定義し、健康値が負になることを防いでいます。
コンストラクタのオーバーロード
クラスには複数のコンストラクタを定義することができます。これをコンストラクタのオーバーロードと呼び、異なる引数を持つコンストラクタを作成することで、オブジェクトの初期化方法を柔軟に変えることができます。
public class Player
{
public string Name { get; set; }
public int Health { get; set; }
// デフォルトコンストラクタ
public Player()
{
Name = "Unknown";
Health = 100;
}
// 引数を持つコンストラクタ
public Player(string name, int health)
{
Name = name;
Health = health;
}
}
// 使用例
Player player1 = new Player(); // "Unknown", 100で初期化
Player player2 = new Player("リリィ", 80); // "リリィ", 80で初期化
データのカプセル化
データのカプセル化とは、クラスの内部データを外部から直接アクセスできないように制御することです。これにより、データの不整合を防ぎ、オブジェクトの状態を安全に管理できます。
アクセス修飾子
C#では、アクセス修飾子を使用してクラスメンバーの可視性を制御します。主要なアクセス修飾子は以下の通りです
public: どこからでもアクセス可能。
private: 同じクラス内からのみアクセス可能。
protected: 同じクラスまたは派生クラスからアクセス可能。
internal: 同じアセンブリ内からのみアクセス可能。
カプセル化の実装例
public class Player
{
private int health;
public int Health
{
get { return health; }
private set
{
health = value < 0 ? 0 : value; // 健康値が負にならないようにする
}
}
public Player(int initialHealth)
{
Health = initialHealth;
}
public void TakeDamage(int damage)
{
Health -= damage; // 外部からはHealthに直接アクセスできない
}
}
// 使用例
Player player = new Player(100);
player.TakeDamage(20);
Debug.Log(player.Health); // 出力: 80
このようにすることで、外部から直接healthを変更することができず、常に整合性が保たれます。
まとめ
クラスは、データとその操作を一緒に管理する重要な構造です。
プロパティのアクセサを使用することで、データの整合性を保つことができます。
コンストラクタのオーバーロードにより、オブジェクトの初期化方法を柔軟に変更できます。
データのカプセル化によって、オブジェクトの状態を安全に管理し、外部からの不正なアクセスを防ぐことができます。
次回は、インターフェースとその利用方法について学び、異なるクラス間での共通の振る舞いを定義する方法を探ります。質問があれば、コメントでお知らせください!