【问题标题】:Need help in designing classes for implementing tcp telegram code在设计实现 tcp 电报代码的类时需要帮助
【发布时间】:2018-01-22 00:19:12
【问题描述】:

我想实现一个用 C# 编写的“框架”,用于 Windows 窗体应用程序。

该框架旨在实现一些允许通过 TCP/IP 套接字发送和接收字节数组的基本方法,并将这些字节数组从实现不同 TCP/IP 报文的特定类转换为特定类,这些类由标头数据和有效负载组成数据。

我想到了使用接口、一些抽象基类,并基于它们为不同的协议制定不同的实现。

我已经设计了接口,但限制是我不能在该接口中声明静态成员或构造函数。

这是我的界面:

public interface ITcpTelegramm<T> where T : struct

基于此,我声明

using IUInt16TcpTelegramm  = ITcpTelegramm<UInt16>;
public abstract class TcpTelegramm : IUInt16TcpTelegramm

我将接口实现为抽象方法

public abstract IUInt16TcpTelegramm Analyse(byte[] daten);

因此,每个继承 TcpTelegramm 的类都必须声明这些方法的实现。

但是因为接口不能包含静态方法并且静态方法不能是抽象的,所以我不能强制继承的类将 Analyse 实现为静态:

public static IUInt16TcpTelegramm Analyse(byte[] daten)
{
    /* some code that analyses the byte array and creates an object
       that represents the TCP/IP telegram object in the array */
}

所以现在我有点卡住了。 我要么放弃使用静态方法,要么放弃使用抽象基类。

【问题讨论】:

  • 你说的是电报信使吗? core.telegram.org/api
  • 为什么Analyse() 必须是静态的?你的问题是什么?您已经知道接口不能包含静态成员,所以您肯定不会问如何做到这一点。那么你问的是什么?您有什么问题足够具体,可以避免接受许多不同的可能答案?
  • Analyse() 方法实现了工厂模式。所以我决定,它必须是静态的。 :-) 不,它不是电报信使。它应该是我的应用程序的测试应用程序,它使用不同的专有 TCP/IP 通信协议。

标签: c# tcp protocols


【解决方案1】:

您是对的,您不能将 static 方法声明为 abstract 并且仅将方法设为非static 来解决此问题可能也不是一个好主意,因为它会造成糟糕的设计.

我实际上会选择一条稍微不同的路线。您的 static 方法是工厂方法模式的实现。据我所知,你所有的班级都会有这样的方法。为什么不创建一个工厂类来实现包含您需要的所有工厂方法的接口?

在我看来,这个解决方案会更好,因为

  • 它将类的创建逻辑与其实现分开
  • 您可以更轻松地重用创建逻辑(很可能就是这种情况,因为您的对象似乎密切相关)

您可以阅读有关工厂模式herehere 的更多信息。

【讨论】:

  • 工厂模式并没有直接出现在我的脑海中,但它似乎是解决我问题的好方法。所以我应该创建一个ITCPTelegramFactory,并以此实现我的基类和继承类。
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多