見出し画像

『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を変更することができず、常に整合性が保たれます。

まとめ

  • クラスは、データとその操作を一緒に管理する重要な構造です。

  • プロパティのアクセサを使用することで、データの整合性を保つことができます。

  • コンストラクタのオーバーロードにより、オブジェクトの初期化方法を柔軟に変更できます。

  • データのカプセル化によって、オブジェクトの状態を安全に管理し、外部からの不正なアクセスを防ぐことができます。

次回は、インターフェースとその利用方法について学び、異なるクラス間での共通の振る舞いを定義する方法を探ります。質問があれば、コメントでお知らせください!

いいなと思ったら応援しよう!