C#如何处理多种消息类型?

时间:2018-03-10 09:16:39

标签: c# coding-style standards

我正在编写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
}

1 个答案:

答案 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";
        }
    }
}