Struppi: C++: wie mache ich richtiges OO-Design?

Beitrag lesen

Wenn die Klasse Taschenrechner beispielsweise ein Display-Objekt als Eigenschaft hat, besteht zwischen den beiden Klassen auch eine Beziehung.

Und wie koennte diese Beziehung dann konkret umsetzen?
Bei Rechner ein Attribut "display:Display", das ich dann mit einer setDisplay-Methode aufrufe?

Ja.
Ich bin zwar nicht der OO Crack (deshalb lese ich das auch interessiert mit) aber hier ist es doch klar, ein Rechner "hat ein" Display. Und hat ein bedeutet i.d.R. es ist eine Eigenschaft des Objektes (im gegensatz zu "ist ein" - ein GrünesDisplay ist ein AbstraktesDisplay).

Wie sollte dann die setDisplay-Methode aufgerufen werden?
Entweder mit einem vorher angelegten Display-Objekt, oder ohne Parameter, so dass sie das Objekt selbst anlegt?

Das dürfte die überlassen sein. Wenn du mit setDisplay eine "Factory" aufrufst, also zur Laufzeit das Display ändern willst, ist das vielleicht elegant, aber ob es wirklich nötig ist musst du dir überlegen.

Dann haette ich eine gerichtete Assoziation, bzw eine Komposition, oder?
Waere es schlechter die Beziehung in die andere Richtung zu machen? Also in Display ein Attribut auf das Rechner-Objekt setzen?
Oder braeuchte ich eh eine Beziehung in beide Richtungen?

Braucht das Diplay eine Information über den Taschenrechner? Eigentlich nicht, es braucht nur die Information was es wann anzeigen soll. Also brauchst du nur Schnittstellen um Werte anzuzeigen oder zu löschen. Genau wie auch die Eingabefelder.

Muesste AbstractDisplay dann im einfachsten Fall nur eine abstrakte Funktion "anzeigen(float ergebnis):void" haben, die dann in den abgeleiteten Klassen (z.B. GruenesLeuchtDisplay) ueberlagert wird?
Wie koennte ich aber dann wieder die Beziehung von Rechner auf AbstractDisplay, bzw. GruenesLeuchtDisplay herstellen? Der Datentyp der Referenz in Rechner waere ja dann, je nach Display-Typ unterschiedlich.

Nein, in Display. Das konkrete Display hat bestimmte Eigenschaften um Werte darzustellen. I.d.R. dürften dies einfach Strings sein, d.h. alle deine Werte die du übergibst müßten die Methode toString() haben oder du baust für jeden Datentyp ein anzeige() Funktion die die entsprechende Umwandlungen machen.

Das einzige was mir einfallen wuerde waere nur in die andere Richtung zu gehen, also von Display auf Rechner (mit einer Referenz auf Rechner in einem Attribut von AbstractDisplay). Was aber den Nachteil haette, das ich vom Rechner nicht auf sein Display schliessen kann.

Wieso möchtest du vom Rechner auf das Display schliessen? Das konkrete Display ist dem Rechner egal, der Rechner hat ein Display und ruft dessen Anzeige Funktion auf, fertig. Was dort konkret passiert ist Rechner egal.

Struppi.

--
Javascript ist toll (Perl auch!)