001
12.09.2014, 16:00 Uhr
ao
(Operator)
|
Ich fang mal an:
1. Im allgemeinen sind Anfängerbeispiele wenig geeignet, um die Vorteile der OO (objektorientierten) Programmierung zu zeigen. Es ist im ersten Moment eine Menge syntaktischer Overhead, mit dem man sich rumschlagen muss, von dem man aber vorläufig nur wenig hat. Wirklich deutlich werden die Vorteile erst, wenn die Aufgabenstellung eine gewisse Komplexität erreicht.
2. OO heißt nicht nur Verwendung von Klassen. Das zweite Element, was genauso wichtig ist, ist Vererbung und Polymorphie. Das macht es möglich, nicht nur exakt gleiche Objekte zusammenzufassen, sondern auch "ähnliche" Objekte, die eine gemeinsame Schnittmenge haben.
Beispiel: Grafische Figuren, die auf den Bildschirm gezeichnet werden. Es gibt Rechtecke, Dreiecke und Kreise. Die gemeinsame Schnittmenge ist: * eine Methode, die den Flächeninhalt bestimmt: float Area (); * eine Methode, die die Figur an einer angegebenen Position zeichnet: void Draw (int x, int y);
Aus diesen beiden Elementen definiert man ein sogenanntes Interface und nennt es z.B. IShape. Hier kommen sogenannte "virtuelle Methoden" ins Spiel, das sind Platzhalter für tatsächliche Methoden. Als Vereinbarung gilt: Alles, was sich IShape nennen will, muss Code für diese beiden Methoden bereitstellen (man sagt auch "das Interface implementieren").
Dann definiert man drei Klassen (Rectangle, Triangle und Circle) und leitet alle drei von IShape ab. Damit das Ganze vollständig ist, programmiert man für jede der Klassen die Methoden Area und Draw aus (Implementierung).
Die tun von außen betrachtet in allen drei Klassen dasselbe (den Flächeninhalt berechnen bzw. die Figur zeichnen). Intern unterscheiden sie sich natürlich, weil die Flächenberechnung für Rechtecke, Dreiecke und Kreise nun mal unterschiedlich ist. Und die zum Malen nötigen Schritte auch.
Das nennt sich Polymorphie, und das ist genial. Ein Programm kann eine lange Liste von Shapes verwalten (über das Interface IShape - jede Figur ist ein Shape und kann über einen IShape-Pointer oder eine IShape-Referenz angesprochen werden) und braucht sich dabei nicht darum zu kümmern, welche Arten von Figuren das sind und wie sie gezeichnet werden. Das wissen die Figuren selber.
Das Hantieren mit den virtuellen Methoden erledigt der C++-Compiler. Und der kann auch prüfen, ob alles passt. In ein Array von IShape* kriegt man nur Objekte rein, die von IShape abgeleitet sind. Schummelt man da versehentlich was anderes rein, was nicht von IShape abgeleitet ist, gibts einen Fehler zur Compilezeit (nicht zur Laufzeit).
Das erhöht die Fehlersicherheit beträchtlich. Wenn der Compiler das abnickt, sind die Schnittstellen alle korrekt, und Fehler können nur noch in der Implementierung liegen, d.h. in relativ kurzen Codestücken, die man noch überblicken kann. |