mikrocontroller.net

Forum: PC-Programmierung Prinzipfrage: Klasse ableiten oder einbetten?


Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leuts,
ich habe mal eine generelle Frage:
Ich muss von einem PC verschiende Messgeräte über RS232 ansprechen.
Nun habe ich von Codeproject.com eine Klasse zur seriellen 
Kommunikation, die auch einwandfrei funktioniert. Ich möchte für jeden 
Messgerättyp eine eigen Klasse anlegen. Nun kann ich ja generell gesehen 
zwei verschiedene Wege gehen:

1. Ich leite meine neu zu erstellenden Klassen von der seriellen ab, 
womit ich diese quasi erweitere
2. Ich bette in meine neue Klasse eine Variable vom Typ der seriellen 
Klasse ein, wodurch ich die notwendigen Funktionen habe.

Welchen Weg würdet ihr empfehlen und warum ?

Greets Karlheinz

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob du ableiten oder es als Membervariable einbauen willst, sollte 
darüber entschieden werden, welche Art von Beziehung die Klassen 
zueinander haben. Ist es eine "ist-ein"-Beziehung, dann ableiten. 
Aggregation dagegen drückt eine "hat-ein"-Beziehung aus.
Also, würdest du sagen, dein Meßgerät "ist eine" serielle Verbindung 
oder "hat eine" serielle Verbindung?

Autor: Hermann-Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Rolf Magnus:
war schneller und nimmt mir die Worte aus dem Mund

Ich glaube, dass "hat-ein" von Coding her zwar aufwendiger ist, aber die 
meisten Anwendungsfälle, bei denen beliebige Geräte via RS232 
angesprochen werden sollen besser abdeckt, es wäre also meine 
favorisierte Lösung, ausser, es handelt sich um ein Gerät zur seriellen 
Kommunikation.

Ein weitere Frage, die man sich auch stellen sollte, ist:
Will ich, dass der Benutzer meiner Geräteklasse (das muss ja nicht 
unbedingt ich selbst sein) beabsichtigt oder unbeabsichtigt an meiner 
Klasse vorbei auf die Basis-Klasse zugreift und Dinge tut, die die 
Konsistenz des Systems (den Zustand des Basisklassen-Objektes) in Frage 
stellt (z.B. Parameter der seriellen Schnittstelle verändert)?
Zugegeben, mit entsprechendem Aufwand, alle Methoden überschreiben, 
protected/private inheritance etc. kann man das unterbinden, aber wenn 
es einfacher geht...

Ich würde selbst noch etwas weitergehen, und den künftigen 
Anwendungsfall bzw. das Ziel der Entwicklung noch etwas näher 
beleuchten:
1. mehr als ein Gerät pro serieller Schnittstelle?
2. mehrere serielle Schnittstellen mit mindestens einem Gerät?

Im Fall 1) sollte die serielle Schnittstelle auch nur einmal 
initialisiert werden, natürlich (?) für alle Geräte mit denselben 
Parameter. Für den Fall 2) bräuchte jede Geräte-Klasse einen 
Konstruktor, der ein bereits initialisiertes CSerial-Object übergibt 
(nahm an es handelt sich um die hier vorgestellte Klasse: 
http://www.codeproject.com/system/serial.asp).
Beides spricht, also für eine "hat-ein"-Beziehung.

Sicher macht es auch Sinn, gemeinsame Eigenschaften der Geräteklassen in 
eine eigene Geräte-Basisklasse zu destillieren, und die sollte mit 
serieller-Kommunikation erst mal nichts zu tun haben.

Für die "fortgeschritteneren" Klassen (z.B. CSerialEx) aus o.g. 
Repositorium (mit Event-Handling) wird das Weiterreichen der Events 
aufwendig, jede Geräteklasse braucht einen Event-Handler der bei der 
Basis-Klasse irgendwie registiert werden muss. Vermutlich muss man dann 
noch eine Art Registratur als Zwischenschicht einführen (mit 
"ist-ein"-Beziehung zur Basisklasse). Aber das führt hier zu weit...

Ohne Näheres gelesen zu haben, denke ich doch, dass diese Klassen von 
alleine dazu nicht in der Lage sind, spricht also gegen die 
"ist-ein"-Beziehung.

HJ

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weder/noch.
eine klasse für die RS232 würde ich als 'singleton' anlegen.

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toll. Und was machst du, wenn du ne Kiste mit zwei seriellen hast und 
beide aufs mal benutzen willst?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann lege ich 2 singletons an :-)

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setzen, sechs.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.