我正在编写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
}
答案 0 :(得分:2)
您有多种选择可供选择。这是一个基于继承的解决方案。
// 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";
}
}
}