Variablenabhängige Unter-Unter-klassen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Maximilian1989.

    Variablenabhängige Unter-Unter-klassen

    Hallo Leser,

    Ich bitte Sie mir bei folgendem Problem zu helfen.

    Hintergrund: Mein Programm erhält JSON-Messages, diese sollen verarbeitet und später in eine DB geschrieben werden. Zur Verarbeitung möchte ich die JSON-Daten über den serializer in eine Klasse schreiben.

    Problem: Ich habe nun das Probleme, eine Klasse mit mehreren Ebenen an Unterklassen zu erstellen, die zu dem JSON-Format passt. Ich habe in dem JSON ein Array, welches ich in meiner Klasse als eine Variable mit "List of"-Unterklasse einbinde.

    VB.NET-Quellcode

    1. Public <Variable> As List(Of <Unterklasse>)


    Dies funktioniert für statische Unterklassen auch ohne Probleme. Ich weis allerdings nicht, wie ich eine Unter-Unter-Klasse, abhängig von einer Variable der Haupklasse einbinden kann. Ich müsste also in meiner Unterklasse eine Fallunterscheidung einbauen, die entweder die Unter-Unter-Klasse A oder B einbindet. Wie kann man das erreichen?

    Meine Klassen sehen bisher so aus:

    VB.NET-Quellcode

    1. Public Class Message
    2. Public resultType As String
    3. Public version As String
    4. Public uploadKeys As List(Of UploadKey)
    5. Public generator As Generator
    6. Public currentTime As String
    7. Public columns As List(Of String)
    8. Public rowsets As List(Of Rowset)
    9. End Class
    10. Public Class Rowset
    11. Public generatedAt As String
    12. Public regionID As String
    13. Public typeID As String
    14. '... Fallunterscheidung
    15. Public rows As List(Of RowA)
    16. 'Public rows As List(Of RowB)
    17. End Class
    18. Public Class RowA
    19. Public date As String
    20. '...
    21. End Class
    22. Public Class RowB
    23. Public bid As Boolean
    24. '...
    25. End Class


    In der Klasse "Message" ist der String "resultType" dafür verantwortlich, ob die Klasse "RowA" oder "RowB" eingebunden werden soll.

    Vielen Dank für Ihre Unterstützung.
    Ich verstehe nicht genau was du da machen willst, aber vllt solltest du Vererbung einsetzen. Eine (abstrakte => MustInherhit) Klasse RowBase könnte allgemeine Funktionalität die für alle Rows gleich ist implementieren und spezifische Methoden definieren (MustOverride), die dann in den Unterklassen entsprechend implementiert werden.

    RowA und RowB erben dann von RowBase. Du kannst aber sowohl RowA als auch RowB in eine List(of RowBase) speichern. Ist wie mit einer Garage, da kannst du Fahrzeuge reinstellen - ob das nun ein Dreirad oder ein Auto ist spielt keine Rolle. Stichwort: Polymorphie - Fahrzeug.Bremse() ruft die Auto.Bremse-Methode auf, wenn es ein Auto ist, und die Dreirad.Bremse-Methode wenn es ein Dreirad ist.

    Eine Structure statt einer Klasse zu nehmen bringt denke ich nichts.

    Maximilian1989 schrieb:

    Ich habe nun das Probleme, eine Klasse mit mehreren Ebenen an Unterklassen zu erstellen, die zu dem JSON-Format passt.
    Gugst Du hier.
    Gugst Du auch hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe das Problem nun folgendermaßen gelöst:

    Als erstes nutze ich den json-Serializer mit einer Klasse, welche nur die Variable "resultType" enthält, anschließend teste ich welcher String darin enthalten ist, und nutze dann den Serializer nocheinmal mit der dazugehörigen Klasse, die dann die entsprechenden unterschiedlichen Unter-Klassen einbindet.

    VB.NET-Quellcode

    1. Dim marketJson = Encoding.UTF8.GetString(decompressed)
    2. ' Un-serialize the JSON data to a dictionary.
    3. Dim serializer = New JavaScriptSerializer()
    4. 'Dim dictionary = serializer.Deserialize(Of Dictionary(Of String, Object))(marketJson)
    5. 'Nur Result-Type herausfinden, um die RichtigeMessage, order oder history, zu nutzen
    6. Dim JSONMessageType = serializer.Deserialize(Of MessageType)(marketJson)
    7. If JSONMessageType.resultType = "orders" Then
    8. Dim JSONMessage = serializer.Deserialize(Of OrderMessage)(marketJson)
    9. 'Testausgabe
    10. For Each i In JSONMessage.uploadKeys
    11. TextBox3.AppendText(i.key)
    12. TextBox3.AppendText("#")
    13. TextBox3.AppendText(i.name)
    14. TextBox3.AppendText(Environment.NewLine)
    15. Next
    16. ElseIf JSONMessageType.resultType = "history" Then
    17. Dim JSONMessage = serializer.Deserialize(Of HistoryMessage)(marketJson)
    18. 'Testausgabe
    19. For Each i In JSONMessage.uploadKeys
    20. TextBox3.AppendText(i.key)
    21. TextBox3.AppendText("#")
    22. TextBox3.AppendText(i.name)
    23. TextBox3.AppendText(Environment.NewLine)
    24. Next
    25. Else
    26. 'Fehlermeldung
    27. TextBox3.AppendText(Environment.NewLine)
    28. TextBox3.AppendText("Fehler: Keine Order oder History Message:")
    29. TextBox3.AppendText(Environment.NewLine)
    30. TextBox3.AppendText(marketJson)
    31. TextBox3.AppendText(Environment.NewLine)
    32. End If


    Hier ein Auszug aus den genutzen Klassen:

    VB.NET-Quellcode

    1. Public Class MessageType
    2. Public resultType As String
    3. End Class
    4. Public Class OrderMessage
    5. Public resultType As String
    6. Public version As String
    7. Public uploadKeys As List(Of UploadKey)
    8. Public generator As Generator
    9. Public currentTime As String
    10. Public columns As List(Of String)
    11. Public rowsets As List(Of OrderRowset)
    12. End Class
    13. Public Class HistoryMessage
    14. Public resultType As String
    15. Public version As String
    16. Public uploadKeys As List(Of UploadKey)
    17. Public generator As Generator
    18. Public currentTime As String
    19. Public columns As List(Of String)
    20. Public rowsets As List(Of HistoryRowset)
    21. End Class