Как вызвать разные методы для разных типов классов в общем приемнике сообщений? - PullRequest
3 голосов
/ 24 марта 2012

Предположим, у меня есть базовый класс IMessage и множество классов производных сообщений.

В моей программе у меня есть один метод, который получает все сообщения:

void ReceiveMessage(IMessage message)
{
}

, и я хотел бывызывать определенный метод для каждого типа сообщения.Было бы замечательно, если бы я мог сделать:

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

void HandleMessage(DummyMessage message)
{
    Blah;
}

void HandleMessage(SillyMessage message)
{
    Yuk;
}

.. но, очевидно, " мы не пойдем так ".

Так как бы я пошело реализации конкретных обработчиков для определенных сообщений, вызываемых из одного обработчика сообщений?

Ответы [ 4 ]

4 голосов
/ 24 марта 2012

Классический способ справиться с ситуацией такого типа - шаблон Visitor .

При этом, вы можете справиться с этим немного проще в C # через dynamic, вот так:

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

Механизм динамического связывания во время выполнения найдет «наилучшее» соответствие для вашего конкретного типа сообщения и направит вызов соответствующему методу.

1 голос
/ 24 марта 2012

В вашем интерфейсе IMessage должна быть определена функция HandleMessage (), которую реализует каждый тип:

public interface IMessage
{
    void HandleMessage();
}

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

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

Тогда вы бы назвали это так:

void ReceiveMessage(IMessage message)
{
    message.HandleMessage();
}
0 голосов
/ 24 марта 2012

Можно сделать то, что вы предлагаете, хотя это не очень СУХО, и я думаю, что другие предложения здесь более уместны.Тем не менее, в интересах полноты, вот подход, близкий к тому, что вы изначально искали:

void ReceiveMessage( IMessage message ) {
  if( message as DummyMessage != null ) HandleMessage( message as DummyMessage );
  else if( message as SillyMessage != null ) HandleMessage( message as SillyMessage );
  // etc
}
0 голосов
/ 24 марта 2012

Попробуйте использовать фабричный метод. Посмотрите на шаблон дизайна фабрики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...