【C#】GameStatusのインスタンスを複数のクラスで共有する方法

C#において、システム全体で共有される状態を管理する場合、GameStatusのようなクラスを複数のクラスで共有することがあります。これにより、ゲームやアプリケーション全体の進行状況や状態を1つのインスタンスとして管理し、クラス間で同じ状態にアクセスできます。この技術資料では、以下の3つの一般的なアプローチについて解説します。

  1. シングルトンパターンの使用
  2. 依存性注入 (DI) の使用
  3. 静的メンバーの使用

シングルトンパターンの使用

概要

シングルトンパターンを使うことで、GameStatusはアプリケーション全体で1つのインスタンスとして管理され、どのクラスからも同じ状態にアクセスすることが可能です

実装例

public class GameStatus
{
    public string CurrentState { get; set; }
}

public class GameManager
{
    private static GameManager _instance;
    public GameStatus Status { get; private set; }

    private GameManager()
    {
        Status = new GameStatus();
    }

    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new GameManager();
            }
            return _instance;
        }
    }
}

public class SomeClass
{
    public void SetGameState(string state)
    {
        GameManager.Instance.Status.CurrentState = state;
    }
}

public class AnotherClass
{
    public void PrintGameState()
    {
        Console.WriteLine(GameManager.Instance.Status.CurrentState);
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        SomeClass someClass = new SomeClass();
        someClass.SetGameState("Playing");

        AnotherClass anotherClass = new AnotherClass();
        anotherClass.PrintGameState();
    }
}

実行結果

Playing


依存性注入 (DI) の使用

概要

依存性注入を使用すると、GameStatusのインスタンスをクラス間で簡単に共有できます。DIは特にASP.NET Coreのようなフレームワークでよく使用されます。

実装例

public class GameStatus
{
    public string CurrentState { get; set; }
}

public class GameManager
{
    public GameStatus Status { get; set; } = new GameStatus();
}

public class SomeClass
{
    private readonly GameManager _gameManager;

    public SomeClass(GameManager gameManager)
    {
        _gameManager = gameManager;
    }

    public void SetGameState(string state)
    {
        _gameManager.Status.CurrentState = state;
    }
}

public class AnotherClass
{
    private readonly GameManager _gameManager;

    public AnotherClass(GameManager gameManager)
    {
        _gameManager = gameManager;
    }

    public void PrintGameState()
    {
        Console.WriteLine(_gameManager.Status.CurrentState);
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        GameManager gameManager = new GameManager();

        SomeClass someClass = new SomeClass(gameManager);
        someClass.SetGameState("Paused");

        AnotherClass anotherClass = new AnotherClass(gameManager);
        anotherClass.PrintGameState();
    }
}

実行結果

Paused


静的メンバーの使用

概要

静的メンバーを使用することで、複数のクラスから直接アクセスできるGameStatusオブジェクトを簡単に作成できます。

実装例

public class GameStatus
{
    public string CurrentState { get; set; }
}

public static class GameManager
{
    public static GameStatus Status { get; set; } = new GameStatus();
}

public class SomeClass
{
    public void SetGameState(string state)
    {
        GameManager.Status.CurrentState = state;
    }
}

public class AnotherClass
{
    public void PrintGameState()
    {
        Console.WriteLine(GameManager.Status.CurrentState);
    }
}

使い方

public class Program
{
    public static void Main(string[] args)
    {
        SomeClass someClass = new SomeClass();
        someClass.SetGameState("GameOver");

        AnotherClass anotherClass = new AnotherClass();
        anotherClass.PrintGameState();
    }
}

実行結果

GameOver


まとめ

  • シングルトンパターンは、ゲーム全体の進行状況などを1つのオブジェクトで管理したい場合に最適です。
  • 依存性注入は、フレームワークを使用する際に便利で、拡張性やテストがしやすくなります。
  • 静的メンバーは、最もシンプルに状態を共有する方法ですが、規模が大きくなると管理が難しくなる場合があります。

ゲームやシステム全体の進行状況や状態を管理する際には、状況に応じて最適な方法を選びましょう。

C#

Posted by hidepon