2016-03-29 5 views
0

Ich habe eine C++ - Klasse A, die Frames von CAN-Schnittstelle auf einem Mikrocontroller erfasst. Ich versuche, eine andere Klasse B (und C und D ..) zu implementieren, die die Frames verwendet, die von Klasse A nacheinander erfasst werden. Im Wesentlichen leitet die Klasse A die erfassten Rahmen abhängig vom Inhalt des Rahmens zu einer der Klassen von der oberen Schicht um. Sollte ich eine Art von Ereignisbehandlungsmechanismus implementieren (mit dem ich nicht so vertraut bin, ein Programmierneuling zu sein), so dass jedes Mal, wenn ein Rahmen empfangen wird, ein Ereignis auf das Objekt der Klasse von der oberen Schicht abgefeuert wird? Oder kann ich dies erreichen, indem ich Klasse B, C, ... von Klasse A vererbe und so weiter. Kann mir jemand helfen, hier eine gute und einfache Logik zu entwickeln?Ereignisbehandlung zwischen Objekten unterschiedlicher Klassen

Edit: Eine nicht so gute Möglichkeit zu tun ist, dass ich eine switch-Anweisung in der Klasse A habe und dann die so genannte Prozessmethode einer der Klassen B, C, D, .... basierend auf einem Fall aufrufen Wert. Dies ist jedoch kein cleverer Weg, denn Klasse A verwendet jetzt Klassen B, C, D ... usw., die ich nicht möchte. Klasse A sollte nichts über Klassen B, C, D, ... wissen.

+0

Ich würde wahrscheinlich eine gemeinsame Schnittstelle (Basisklasse) für jeden der Prozessoren definieren, die eine "Arbeit/Prozess" -Funktion erklären würde. Ich würde sie alle in einem Container lagern. Ich hätte eine "Controller" -Klasse, die Klasse A verwenden würde, um den Rahmen zu erhalten und ihn an jeden der Listen-Controller zu übergeben. Nun, wie Sie die Liste der Controller erstellen, hängt davon ab, ob die Reihenfolge wichtig ist usw. –

+0

Ich habe eine Bearbeitung vorgenommen. Kannst du es nochmal sehen? – Paindoo

+0

Ich verstehe, du meinst eins und nur eine der Klassen B, C oder D kann den Rahmen verarbeiten. Sie wissen welches durch einen der Feldwerte. Dies ist eine sehr häufige Verwendung der Factory-Design-Muster, schauen Sie es auf Google. Wenn Sie nicht wissen, welches, dann könnten Sie die Kette der Verantwortlichkeitsmuster verwenden, die weniger üblich ist, aber ich könnte einen Pseudocode dafür schreiben, wenn Sie wollen. –

Antwort

0

Beispiel: Klasse A enthält std::list<B*>, wobei B eine Basisklasse mit einer Handlermethode virtual ist. Mehrere Klassen (C, D, E) erben Klasse B und überladen diese Methode. Dann fügen Sie einfach Instanzen von abgeleiteten Klassen hinzu, um sie in A nach Zeiger aufzulisten (zum Beispiel: std::list<B*> workers {new C, new D, new E};), und rufen Sie für jede Instanz eine überladene Methode auf. Jede Klasse entscheidet selbst, ob sie den aktuellen Frame akzeptiert und auf eigene Art verarbeitet.

0

Sie können sich die Observer design pattern ansehen. Grundsätzlich können Sie eine beobachtbare Klasse haben (in Ihrem Fall class A) und mehrere Beobachter (in Ihrem Fall class Bclass C usw.). Die Beobachter registrieren sich bei der beobachtbaren Klasse für die Ereignisbenachrichtigung. Ich habe einen Beispielcode EventInterface Model, der Qt-Stil-Verbindungen zwischen Objekten ermöglicht. Die gesamte Anwendung muss das Ereignis des beobachtbaren Objekts mit dem Ereignishandler des Beobachterobjekts verbinden.