2016-04-21 85 views
0

我正在写一个游戏服务器。采取多态性方法?

我有一个类叫NetMessage。该类用作通过网络发送的字节数组之间的中间值。

当服务器接收到字节数组时,它将其更改回NetMessage并列出这些列表,并将其交给经理。

NetMessage是一个抽象类,因此所有的消息都来自它,但是当数据到达GameManager时,它可能必须对所获得的数据做大不相同的事情。

例如,NetMoveMessage需要与NetConnectMessage的处理方式不同。

此外,消息本身除了序列化自身之外没有任何方法,本身也不能改变状态。只有经理可以,所以他们基本上只是数据类。

现在决定如何处理数据,我只是简单地检查它是什么类型的消息。例如

  NetMessage message = IncomingMessages.First.Value; 
      IncomingMessages.RemoveFirst(); 

      if(message is NetConnectMessage) 
      { 
       //cool things here 
      } 
      else if(message is NetMoveMessage) 
      { 
       //Isn't this exciting? 
      } 

这是不好的做法?有一个更好的方法吗?对我来说,考虑到消息没有做任何事情似乎很好,所以读取数据的唯一方法是确定需要阅读的数据,并相应地处理它。如果有一些明显的更好的方法,我很想念,但随时启发我。

回答

1

你可以使用,这将是更快的大量元素,但只慢一些,由于它的开销

Dictionary<Type, Action<NetMessage>> messageHandlers = new Dictionary<Type, Action<NetMessage>>(); 

void RegisterHandler(Type type, Action<NetMessage> handler) 
{ 
    messageHandlers.Add(type, handler); 
} 

void MessageReceived(NetMessage message) 
{ 
    messageHandlers[message.GetType()].Invoke(message); 
} 

然后,您可以注册使用

RegisterHandler(typeof(NetMessageSubClass), delegate(NetMessage message) 
{ 
    //NetMessageSubclass related stuff 
}); 

有事件解释也可能是一个使用泛型的更方便的解决方案,但目前我想不起来。


编辑这里的通用方法

void RegisterHandler<T>(Action<T> handler) where T : NetMessage 
{ 
    messageHandlers.Add(
     typeof(T), 
     (NetMessage message) => handler.Invoke((T)message) 
    ); 
} 
1

是的,当然有更好的方法来做到这一点。这是一个多态使用的完美例子。

在抽象基类中声明的虚拟方法(NetMessage):

//sidenote, the method 
public virtual void DoCoolStuff(){} 

而在你的派生类(NetConnectMessageNetMoveMessage覆盖的方法做任何它需要该类在做特定。

public override void DoCoolStuff(){ 
    //make it do cool stuff :D 
} 

并且代替许多如果的和别人的,你现在可以叫它像这样:

NetMessage message = IncomingMessages.First.Value; 
IncomingMessages.RemoveFirst(); 
message.DoCoolStuff(); 

这正是多态性是如何工作的:它会在运行时确定什么类型的信息邮件的实际是,并相应地调用适当的方法。

+0

的东西是消息不会做任何事情。所有的消息都包含数据,说明某件事想做什么。例如,移动消息实际上不能移动任何东西,因为它没有像玩家那样的信息来做类似的事情。服务器实际上是模拟这些事情,然后根据这些事件写出新消息发送出去。 –

+0

啊,好吧。然后我不明白需要有消息类。 那么,无论你决定使用什么方法,它会回到if/else的某处(或者编写一个具有相同名称的方法,重载它们以接收每种类型消息的不同参数)。 – Vucko