我正在编写一个 C# 套接字网络库。我正在定义一个 BaseMessage 类,我将从中派生出所有消息类型(例如 UpdateNameMessage、UpdateStatusMessage)。
然后,我将能够通过调用服务器的 SendMessage 方法来发送它们,该方法将采用 BaseMessage 消息。
但是,我希望每个 BaseMessage 还包含已定义的 MessageType 属性。 我的问题来自于如何使用“最佳实践”风格的方式标准化这些消息类型的编号? 我目前有一个使用枚举的示例,但是,对于使用该库的人来说,他们无法从枚举继承来添加自己的消息类型。
我想到了using a class ,并定义常量。但这相当丑陋,而且不能作为答案。
我考虑编写一个静态类,您可以在启动时注册消息类型。
MessageTypeDictionary.Add("Heartbeat");
但我不喜欢用户稍后将 MessageType 作为字符串编写消息的方式,这不是最好的方式:
new BaseMessage("Alice", "Bob", "Heartbeat")
我当前的代码:
服务器会发送如下消息:
public void SendMessage(BaseMessage message) { }
BaseMessage 目前看起来像这样:
public class BaseMessage
{
public string To { get; protected set; }
public string From { get; protected set; }
public MessageType MessageType { get; protected set; }
public BaseMessage(string to, string from, MessageType messageType)
{
To = to;
From = from;
MessageType = messageType;
}
}
最后,MessageType 枚举如下所示
public enum MessageType
{
CONNECT,
DISCONNECT,
UPDATENAME
}
最佳答案
您有很多选项可供选择。这是一个基于继承的解决方案。
// Abstract base class
public abstract class BaseMessage
{
public string To { get; protected set; }
public string From { get; protected set; }
public abstract string MessageType { get; }
public BaseMessage(string to, string from)
{
To = to;
From = from;
}
}
// Concrete class for every message type.
public class HearthbeatMessage : BaseMessage
{
public override string MessageType
{
get
{
return "Hearthbeat";
}
}
}
关于C# 如何处理多种消息类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49207386/