У меня есть вопрос об изменении системы сообщений, которую я построил. Для ясности используйте псевдокод, чтобы показать, как он работает. Этот вопрос будет не о конкретном c бите кода, а о том, есть ли способ сделать то, что я хочу. Я попытался и просто получил вложенность в сложности, которая не работала.
Итак, теперь у меня работает система сообщений, которая вызывает метод при публикации сообщения. Он передает объект, и метод должен привести объект к правильному классу. Я пытаюсь сделать так, чтобы сообщение publi sh передавало аргумент типа generi c и то же самое, когда вы регистрируете слушателя / подписчика, вам нужно передать аргумент типа. В результате метод обратного вызова получит правильный типизированный объект. Я пробовал несколько способов, используя и. Кроме того, тип MessageType хранится в объекте прослушивателя, чтобы знать, к чему присылать сообщение при широковещательной передаче.
Увы, мои неудачные попытки пропали, поэтому у меня просто есть этот псевдокод, я рефакторинг его в более простую версию, которая передает на объекте.
// ТЕКУЩАЯ СООБЩЕНИЕ с использованием объекта - псевдокод
Listener
string topic,
Action<object> callback,
object message
MessageBus
ListOfListeners<Listeners>
void Register(string topic,Action<object> callback)
{
Listeners.Add(new Listener(topic, callback));
}
void Publish (string topic, object message)
{
foreach listener
{
if(listener.topic == topic)
{
listener.callback.invoke(message);
}
}
}
MyClass
void setup ()
{
MessageBus.Register("somethingHappened", ReactToSomething );
}
void ReactToSomething( object message)
{
SomethingHappened info = (SomethingHappened)message;
React(info);
}
MyOtherClass
void Broadcast_TheThingHappened()
{
var happening = new SomethingHappened("Help me Obi Wan!");
MessageBus.Publish("somethingHappened", happening );
}
// СООБЩЕНИЕ - идеальный код сна с использованием типизированного возвращаемого объекта - псевдокод
Listener<T>
string topic,
Action<T> callback,
Type messageType // Im not sure about this
object message
MessageBus
ListOfListeners<Listeners>
void Register<T>(string topic,Action<T> callback)
{
Listeners.Add(new Listener<T>(topic, callback, typeof(T));
}
void Publish<T> (string topic, <T> message)
{
foreach listener
{
if(listener.topic == topic)
{ var callback = (Action<T>)listener.Callback;
callback.invoke(message);
}
}
}
MyClass
void setup ()
{
MessageBus.Register<SomethingHappened>("somethingHappened", ReactToSomething );
}
void ReactToSomething( SomethingHappened message)
{
SomethingHappened info = (SomethingHappened)message;
React(info);
}
MyOtherClass
void Broadcast_TheThingHappened()
{
var happening = new SomethingHappened("Help me Obi Wan!");
MessageBus.Publish<SomethingHappened>("somethingHappened", happening );
}