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

标签 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
}

最佳答案

您有很多选项可供选择。这是一个基于继承的解决方案。

// 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/

相关文章:

coding-style - 如何配置 PyCharm 以合理的方式换行

c# - 编码风格 - 将方法作为参数传递

linux - LSB 中是否有 RPM 文件命名约定?

javascript - Array.prototype.* 在类似对象或原生/宿主对象上的可移植性

c# - 使用交错数组进行线性搜索?

c# - sqlite,如何避免在删除父记录时插入新记录?我使用 C# 和 EF 4.4

c# - Diagnostics.Process - 将输出转储到文件

c# - asp.net母版页执行的顺序

javascript - style.display ='none' 不适用于 chrome 中的选项标签,但它适用于 firefox

c++ - C++ 标准是否要求无符号整数的最大值为 2^N-1 形式?