none
Frage zu Klassen - Codeauswertung teilweise in Basisklasse und in abgeleiteter Klasse

    Frage

  • Wie bereits in der vorigen Frage angedeutet, versuche ich mithilfe einer Basisklasse und den daraus abgeleiteten Klassen sich wiederholende Elemente zu vereinfachen.

    Ich hoffe, ich verwende die korrekte Nomenklatur.

    Im Grundprinzip werden über einen CAN-Bus eintreffende Nachrichten im ersten Schritt nach einem Typcode aufgeteilt und dann an die jeweils zuständige Klasse weitergeleitet.

    Das funktioniert momentan etwa so:

    select case typcode

     case 4711:

        Call classA.HandleMessage(nachricht)

    case 0815:

       call ClassB.HandleMessage(nachricht)

    Ob das besser geht, sei dahin gestellt.

    Ausserdem gibt es ein Kommandobyte, welches je nach Absender der NAchricht verschiedene Aktionen auslöst.

    Dabei gibt es manche Kommandos/Nachrichten, die bei allen Absendern gleich sind, z.B. "Alive", "Ready" oder "Busy" u.a.

    Andere sind spezifisch, z.B "Taste gedrückt" oder "Winkel"

    Dementsprechend möchte ich die generischen Kommandos/Nachrichten von der Basisklasse behandeln lassen , die spezifischen aber jeweils in der Tochterklasse.

    Wie realisiert man das ?

    Die Funktion HandleMessage müsste  wahrscheinlich in jeder Tochterklasse vorhanden sein und die spezifischen Codes abarbeiten und bei fehlender Zuständigkeit eine Funktion der übergeordneten Klasse aufrufen - richtig ?

    Ich habe zwar bereits funktionierenden Code, der wird aber zunehmend unüberischtlicher.

    Donnerstag, 28. März 2013 10:42

Alle Antworten

  • Hallo Nico,

    so sollte man das nun wirklich nicht machen - und ich habe mich erst einmal schütteln müssen ;)

    Wenn Du schon die Vorzüge von Klassen entdeckt hast, wäre der nächste Schritt die Vorzüge von virtuellen Methoden zu entdecken - in Visual Basic mit Overridable  und/oder MustInherit zu erzielen.

    Die zwei Möglichkeiten exemplarisch dargestellt:

    Public MustInherit Class GenericMessage
    
        ' Stellt eine Methode bereit, die überschrieben werden kann 
        Public Overridable Sub MessageHandler(message As String)
            Console.WriteLine("GenericMessage MessageHandler")
        End Sub
    
        ' Abstrakte Methode, *muss* von der abgeleiteten Klasse implementiert werden
        Public MustOverride Sub HandleMessage(Message As String)
    End Class
    
    Public Class MessageA
        Inherits GenericMessage
    
        Public Overrides Sub MessageHandler(message As String)
            ' Ruft zuerst Basis Methode auf
            MyBase.MessageHandler(message)
            ' Weitere Behandlung
            Console.WriteLine("MessageHandler MessageA")
        End Sub
    
        Public Overrides Sub HandleMessage(Message As String)
            Console.WriteLine("HandleMessage A")
        End Sub
    End Class
    

    Bei der ersten Variante MessageHandler implementiert die Basisklasse eine gemeinsame Funktionalität. Die abgeleitete Klasse kann sie nun überschreiben um weitere oder andere Funktionalität hinzuzufügen.

    Die zweite Variante mit MustOverride - erfordert zusätzlich MustInherit auf Klassenebene - wäre für solche Fälle, wo es keine Basisfunktionalität gibt, die abgeleitete Klasse die Funktion aber implementieren muss. Innerhalb der Basisklasse kann man die Funktion dann verwenden und sich darauf verlassen, dass sie existiert.

    Der TypeCode wird wie das Select Case damit überflüssig und jede Klasse tut nur das, was sie tun soll. Und der Code wird - richtig aufgeteilt - deutlich übersichtlicher.

    Gruß Elmar

    Donnerstag, 28. März 2013 11:27