Konzepte objektorientierter Systeme objektorientiertes Programmieren Objektorientierte Konzepte • • • • • • Klassen und Objekte Unterklassen und Klassenhierarchien Aggregate, zusammengesetzte Objekte Methoden Objektidentität Abstrakte Datentypen Klassen und Objekte: Beispiel in C++ • Gleichartige Objekte bilden eine Klasse • class Brüche {private: long zähler; long nenner; kürze(); public: Brüche(long z, long n = 1) {zähler = z; nenner = n; kürze();} Brüche& plus(const Brüche &x) {zähler = zähler * x.nenner + nenn ... nenner = nenner * x.nenner; kürze();} Objekte statt Variable • void ausgabe () { cout << zähler << "/" << nenner;} }; // Ende der Klassendefinition • Brüche zahl1 (3, 4); Brüche zahl2 (1, 7); zahl1.plus(zahl2); zahl1.ausgabe (); • 25/28 wird ausgegeben. • Zunächst keine Datenbank: "Suche alle Objekte der Klasse Brüche > 1/4" nicht möglich. Spezialisierung: Klassen mit Unterklassen • class Punkte {private: int x, y; public: Punkte (int px = 0, int py = 0) {x=px; y=py;} move (int dx, int dy) {x+=dx; y+=dy;} int draw (); } • class Rechtecke: public Punkte {private: int höhe, breite; public: Rechtecke (int x, int y, int höhe, int breite); int draw (); } Aggregate • Objekte können aus Teilobjekten bestehen • class Strecken {private: Punkte anfang, ende; int linienstärke; public: Strecken(int xa, int ya, int xe, int ye, int ls); int draw (); } • Rechtecke ist Unterklasse von Punkte, d. h. der linke untere Punkt und zusätzlich Höhe und Breite. • Strecken ist keine Unterklasse von Punkte, sondern ist zusammengesetzt aus Anfangs- und Endpunkt. Unterklasse und Aggregeation Punkt a: 2; 15 Linie s: Anfangspunkt 15;12 Endpunkt 18;9 Linienstärke: 2 ein spezieller Punkt mit Höhe und Breite Rechteck w: 2; 3; 5; 3 richtig: a.x, w.x s.Endpunkt.x falsch: s.x Methoden • Methoden sind Funktionen, die zu einer Klasse gehören. • Sei a Objekt der Klasse k und m Methode von k. Mit a.m(Parameter) wird eine Botschaft an a gesendet, die Methode m auszuführen. • Weniger Seiteneffekte • Attribute erfragen und Methoden aufrufen ist gleich Wechsel der Implementierung einfach, z. B. – Attribut Alter oder – Methode Alter: Berechnung aus Geburtsdatum • Schnittstellendefinition und Implementierung trennen Objektidentität • Jedes Objekt bekommt eindeutigen Identifikator: OID • Diese OID ändert sich nicht während der gesamten Lebensdauer des Objekts. • Die OID bleibt gleich, auch wenn Inhalte sich ändern. • Der Benutzer braucht die OID nicht explizit definieren. • Der Benutzer kann die OID nicht ungewollt ändern. Klassen implementieren abstrakte Datentypen (ADT) • Abstrakte Datentypen beschreiben Verhalten von Daten nach außen, die Implementierung wird verborgen. • Mit Klassen kann man ADTn definieren. • Insbesondere generische Klassen sind dafür geeignet • Beispiel: ADT Kellerspeicher (= stack) Es werden Keller für beliebige Grunddatentypen erzeugt: – Keller für integer – Keller für float – Keller für Personen Beispiel ADT Kellerspeicher TYP Keller [e_Typ] FUNKTIONEN: leer?: Keller [e_Typ] BOOLEAN neu: Keller [e_Typ] rein: e_Typ Keller [e_Typ] Keller [e_Typ] raus: Keller [e_Typ] Keller [e_Typ] lies: Keller [e_Typ] e_Typ VORBEDING.: raus (k Keller[e_Typ]): NOT leer? (k) lies (k Keller[e_Typ]): NOT leer? (k) GESETZE: e e_Typ, k Keller[e_Typ]: leer? (Neu()); NOT leer? (rein (e,k)); lies (rein (e,k)) = e; raus (rein (e,k)) = k.