3

IMessage という基本クラスと、多数の派生メッセージ クラスがあるとします。

私のプログラムには、すべてのメッセージを受け取るメソッドが 1 つあります。

void ReceiveMessage(IMessage message)
{
}

メッセージの種類ごとに特定のメソッドを呼び出したいと思います。私ができれば素晴らしいことです:

void ReceiveMessage(IMessage message)
{
    HandleMessage(message);
}

void HandleMessage(DummyMessage message)
{
    Blah;
}

void HandleMessage(SillyMessage message)
{
    Yuk;
}

..しかし、明らかに「私たちはそのように外出していません」。

では、単一の messagehandler から呼び出されて、特定のメッセージに対して特定のハンドラーを実装するにはどうすればよいでしょうか?

4

4 に答える 4

4

The classic way to handle this type of situation is via the Visitor pattern.

That being said, you can actually handle this a bit easier in C# via dynamic, like so:

void ReceiveMessage(IMessage message)
{
    dynamic specificMessage = message;
    this.HandleMessage(specificMessage):
}

The dynamic binding engine will find, at runtime, the "best" match for your specific message type, and route the call to the appropriate method.

于 2012-03-24T00:23:55.723 に答える
1

Your IMessage interface should have a HandleMessage() function defined that each type implements:

public interface IMessage
{
    void HandleMessage();
}

public class DummyMessage : IMessage
{
     public void HandleMessage()
     {
         Blah;
     }
}

public class SillyMessage : IMessage
{
     public void HandleMessage()
     {
         Yak;
     }
}

Then you would call it like this:

void ReceiveMessage(IMessage message)
{
    message.HandleMessage();
}
于 2012-03-24T00:21:59.433 に答える
0

ファクトリメソッドを使用してみてください。工場のデザインパターンを調べます。

于 2012-03-24T00:18:15.760 に答える
0

あまりDRYではありませんが、あなたが提案していることを実行することは可能です.ここでの他の提案はより適切だと思います. それでも、完全を期すために、最初に探していたものに近いアプローチを次に示します。

void ReceiveMessage( IMessage message ) {
  if( message as DummyMessage != null ) HandleMessage( message as DummyMessage );
  else if( message as SillyMessage != null ) HandleMessage( message as SillyMessage );
  // etc
}
于 2012-03-24T00:52:31.463 に答える