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


von Karlheinz Druschel (Gast)


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

von Rolf Magnus (Gast)


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?

von Hermann-Josef (Gast)


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

von Peter (Gast)


Lesenswert?

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

von Bartli (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

dann lege ich 2 singletons an :-)

von Bartli (Gast)


Lesenswert?

Setzen, sechs.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.