2015-12-10 3 views
1

Я пытаюсь построить структуру в VB, чтобы позволить мне хранить и анализировать сообщение на основе IP/UDP, которое я получаю как HEX, кодированный ASCII.Структуры с условными элементами

Фокус в том, что после того, как я прошел мимо заголовка 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 
+1

@KirillShlenskiy на структуру была способом иметь такие данные в течение многих лет ([знаменитый пример] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627%28v=vs.85%29.aspx)). Вы можете иметь это [в VB.NET тоже] (https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.fieldoffsetattribute%28v=vs.110%29.aspx), хотя вы возможно не следует. – GSerg

+0

@GSerg, хорошая точка re явным образом структуры структуры, хотя я серьезно надеюсь, что это не так, как автор этого вопроса идет. –

+0

@ Kirill На самом деле это целая причина, по которой я задавал этот вопрос. Я действительно не знаю, к какому пути идти в этот момент. Я решительно старался избежать определения структуры, в которой ВСЕ из подструктур типа сообщения были частью его определения. Я родом из вложенного мира.Распространенное использование памяти - это не-no в любое время;) – balmerjd

ответ

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 

Таким образом, вы можете поделиться общими свойствами базового класса и добавить дополнительные свойства для каждого сообщения, где они отличаются.

внимание вам нужен конструктор в каждом конкретном классе для анализа данных в соответствии со своими собственными правилами, но я оставил это для ясности

+0

Хорошо, я как-то понимаю, к чему вы клоните, хотя я не знаком с тем, что делаю в этом манноре. Поэтому, учитывая, что мне также нужно будет обрабатывать и удерживать несколько из этих сообщений за раз, я бы просто объявил и массив класса MeesageBase? – balmerjd

+1

На самом деле вам было бы лучше использовать «Список (MessageBase)», но да, это общая идея. –

+0

Итак, следующий вопрос будет состоять в том, что это должно работать как кольцевой буфер, смогут ли отдельные элементы быть в состоянии переопределяться или мне придется объявлять новый список и повторно заполнять все элементы каждый раз, когда я получаю новое сообщение? * извините, что использовали неправильный термин .. * – balmerjd

2

Основываясь на том, что вы сказали, что это звучит как класс будет лучше всего подходит для ваших потребностей, чем структуры (см MSDN). Вы должны начать с абстрактного базового класса и определить все свои «вкусы» в классах, которые вытекают из него.

Кроме того, я бы не сделал все здание в конструкторах; скорее, я бы определил отдельный класс "builder", который может создавать различные типы экземпляров на основе ваших потребностей.

Вы также можете обнаружить, что сценарий an abstract factory соответствует вашим потребностям лучше, чем строитель, поскольку вы имеете дело с «семейством» объектов.

Вот хорошая отправная точка, чтобы узнать о различных порождающих паттернов проектирования, в том числе «строитель» и «абстрактные завод»: https://en.wikipedia.org/wiki/Creational_pattern

+0

Спасибо за эти конкретные ссылки. Я обязательно прочитаю их. Этот проект, над которым я работаю, немного подталкивает границы того, что у меня есть, с мудрым кодированием. – balmerjd

+2

Вы всегда должны выдвигать свои границы и стараться учиться. Я все еще учился после всех этих лет. Никогда не останавливайся. –

Смежные вопросы