我正在尝试在VB中构建一个结构,允许我存储和解析基于IP / UDP的消息,我收到的是ASCII编码的HEX。
诀窍是,在我通过IP头和UDP头之后,后面的数据是可变结构类型。我的意思是,有一个基本的初始消息结构,其中包含特定字段中的数据...其中三分之二是可选的...但实际数据,即传输的真正含义,是15个不同的消息之一结构。
那么有没有办法根据我放入的数据有条件地定义结构的一个成员?
我的计划是创建一个New()函数,您可以简单地将消息字符串传递给它,它将解析所有数据并根据需要填充结构的成员。但是,如何使其中一个结构成员的声明类型依赖于将在New()函数中解析的数据?或者没有办法真正做到这一点?
基本上是这样的东西(虽然很粗糙):
Private Structure DevMsg
ReadOnly IPHeader As IP_HDR
ReadOnly UDPHeader As UDP_HDR
ReadOnly MsgType As DevMsgType
Select Case MsgType
Case Msg0
ReadOnly Data as MsgType0
Case Msg1
ReadOnly Data as MsgType1
...
End Select
Public Sub New(ByVal msg as String)
... String parser ...
MsgType = blah
... More parsing ...
Data.property0 = blah2
Data.property1 = blah3
...
End Sub
End Structure
答案 0 :(得分:2)
根据您所说的内容,听起来一个类比结构更适合您的需求(参见MSDN)。您应该从一个抽象基类开始,并定义所有的#34;风味"在派生自它的类中。
此外,我不会做建筑师的所有建筑;相反,我定义了一个单独的"builder"类,可以根据您的需要构建各种类型的实例。
您可能还会发现an abstract factory场景比建筑师更适合您的需求,因为您正在处理与家庭打交道的问题。对象。
这是了解各种创作设计模式的良好起点,包括" builder"和#34;抽象工厂":https://en.wikipedia.org/wiki/Creational_pattern
答案 1 :(得分:2)
我认为你应该做的是为从基类继承的每种类型的消息都有一个基类/抽象类和具体类。
这样的事情:
Public MustInherit Class MessageBase
Public ReadOnly Header As String
Public ReadOnly MsgType As Integer
Public Function CreateMessage(message As String) As MessageBase
If message = "type1" Then Return New Type1Message
If message = "type1" Then Return New Type2Message
'etc.
End Function
End Class
Public Class Type1Message
Inherits MessageBase
End Class
Public Class Type2Message
Inherits MessageBase
End Class
通过这种方式,您可以在基类中共享公共属性,并为每个不同的消息添加其他属性。
请注意,您需要在每个具体类中使用构造函数来根据自己的规则解析数据,但为了清晰起见,我将其留下了