2017-08-14 36 views
-1

我想实现一个用C#编写的“框架”,以便与Windows窗体应用程序一起使用。需要帮助设计实现tcp报文代码的类

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

我想过使用接口,一些抽象基类和基于它们的不同协议的独特实现。

我已经设计了接口,但限制了我无法在该接口中使用静态成员或构造函数declarad。

这是我的接口:

public interface ITcpTelegramm<T> where T : struct 

基于此,我宣布

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

在我实现这个接口作为抽象方法

public abstract IUInt16TcpTelegramm Analyse(byte[] daten); 

所以它继承的每个类TcpTelegramm必须声明工具这些方法。

但因为接口不能包含静态方法和静态方法不能是抽象的我不能强迫继承的类来实现分析为静态:

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

所以现在我被困了一点。 我放弃使用静态方法或使用抽象基类。

+0

你在说电报信使吗? https://core.telegram.org/api –

+0

为什么'Analyze()'必须是静态的?你的_question_是什么?你已经知道接口不能包含静态成员,所以你肯定不会问怎么做。那么你在问什么?你有什么问题需要具体解决,以避免面对许多不同的可能答案? –

+0

'Analyze()'方法实现工厂模式。所以我决定,它必须是静态的。 :-) 不,不是电报信使。它应该是我的应用程序的测试应用程序,它使用不同的专有TCP/IP通信协议。 –

回答

1

你是对的,你不能声明static方法为abstract和它可能也不是一个好主意,只是让非static来解决这个问题,因为它创造了不好的设计方法。

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

在我眼里这个解决方案是优越的,因为

  • 它的类的创建逻辑从它们的实现
  • 您可以更轻松(这很可能是这样的重用创建逻辑分离,因为你的目标似乎密切相关)

你可以阅读更多关于工厂模式herehere

+0

工厂模式并没有直接在我的脑海中,但它似乎是我的问题很好的方法。所以我应该创建一个'ITCPTelegramFactory',并从中实现我的基类和继承类。 –