だからここに私のコードがあります:
static class MessageHandler<T> where T : Message
{
public delegate void MessageDelegate(T m);
private static MessageDelegate messageHandlers;
public static void Publish(T message)
{
messageHandlers(message);
}
public static void Subscribe(MessageDelegate messageHandler)
{
messageHandlers += messageHandler;
}
}
Message
他のクラスが継承できる単なる空のクラスです。ほとんどのMessage
派生物は、関連するプロパティを持つ単純なオブジェクトです (これはゲーム用であるためPlayerDamagedMessage
、プロパティとしてダメージと攻撃者を持つ がある場合があります)。
基本的に、Player
クラス内で攻撃されたときに公開しPlayerDamagedMessage
、それについて知りたい他のクラスがサブスクライブして、それが発生したときに関連する詳細を受け取ることができます。
これが複数のメッセージで機能する理由は、ジェネリック クラスが C# で機能するためです。これは、内部で使用されるさまざまなジェネリック型ごとにデリゲートのコピーがあることを意味します。
私は実際に遊んでいるときに偶然これを理解しました.コードを本当に単純化し、この時点でほとんどデザインパターンのように見えるので興奮しています.
この種のアプローチを使用することの潜在的な欠点について質問するためにここに投稿しています。カバーの下にある汎用デリゲートの量に制限はありますか? このスケールのようなものはどれくらいうまくいきますか?
また、ステートメントをこれほど長くする必要がないように、ある種のジェネリック型推論を行う方法はありますか?
MessageHandler<MessagePlayerDamaged>.Publish(new MessagePlayerDamaged(this, this));
読んでくれてありがとう。