【C#】GameStatusのインスタンスを複数のクラスで共有する方法
C#において、システム全体で共有される状態を管理する場合、GameStatus
のようなクラスを複数のクラスで共有することがあります。これにより、ゲームやアプリケーション全体の進行状況や状態を1つのインスタンスとして管理し、クラス間で同じ状態にアクセスできます。この技術資料では、以下の3つの一般的なアプローチについて解説します。
- シングルトンパターンの使用
- 依存性注入 (DI) の使用
- 静的メンバーの使用
シングルトンパターンの使用
概要
シングルトンパターンを使うことで、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つのオブジェクトで管理したい場合に最適です。
- 依存性注入は、フレームワークを使用する際に便利で、拡張性やテストがしやすくなります。
- 静的メンバーは、最もシンプルに状態を共有する方法ですが、規模が大きくなると管理が難しくなる場合があります。
ゲームやシステム全体の進行状況や状態を管理する際には、状況に応じて最適な方法を選びましょう。
ディスカッション
コメント一覧
まだ、コメントがありません