Hallo steckl,
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?
Ich würde die Methode mit einem Parameter vom Typ AbstractDisplay versehen. So kannst du ein beliebiges Display-Objekt hinzufügen.
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?
Nein, das Display braucht eigentlich nicht zu wissen, von wem es benutzt wird. Es bekommt vom Rechner gesagt, was es anzeigen soll und alles weitere hat es nicht zu interessieren.
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?
Genau.
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.
Der große Vorteil von Vererbung ist ja, dass man einer Variable vom Datentyp der Elternklasse auch eine Instanz der Kindklasse haben kann. Das gleiche gilt auch für Methoden-Aufrufe. Der oben erwähnten Methode setDisplay, die einen Parameter für Typ AbstractDisplay erwartet kannst du ein Objekt einer beliebigen Tochterklasse (nennen wir LEDDisplay und TextDisplay als Beispiele) zuweisen.
Du brauchst dich letzendlich also nur ein einziges mal, nämlich dann, wenn das Objekt erzeugt wird, darum zu kümmern welche konkrete Klasse instantiiert werden könnte. Als Pseudo-Code:
int main()
{
...
AbstractDisplay display;
if (display_config == "LED") {
display = new LEDDisplay ();
} else if (display_config = "Text") {
display = new TextDisplay ();
} else {
...
}
...
}
Häufig wird die konkrete Instantiierung dann noch mittels einer Fabrikmethode (Stichwort Factory Method Pattern) ausgelagert, aber das Thema Design Patterns würde jetzt zu weit führen. Falls du dich weiter dafür interessierst, rate ich dir, dir ein gutes Buch über Software-Design zu suchen. Das Thema ist weitaus umfangreicher, als in diesem Thread bisher behandelt.
Schöne Grüße,
Johannes