Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Objektorientierte Programmierung. In C: DatentypVariable Klasse Objekt ist eineVariable In C++ darf man einen Datentyp selbst basteln Dieser heisst dann:

Ähnliche Präsentationen


Präsentation zum Thema: "Objektorientierte Programmierung. In C: DatentypVariable Klasse Objekt ist eineVariable In C++ darf man einen Datentyp selbst basteln Dieser heisst dann:"—  Präsentation transkript:

1 Objektorientierte Programmierung

2 In C: DatentypVariable Klasse Objekt ist eineVariable In C++ darf man einen Datentyp selbst basteln Dieser heisst dann:

3 Kurz: Eine Klasse ist ein höherer, selbstgebastelter Datentyp.

4 Genauer:

5 Eine Klasse ist ein Bauplan (vergleichbar: Backform). In diesem Bauplan steht genau beschrieben, wie ein konkretes Objekt, das nach diesem Bauplan gebastelt wird, auszusehen hat.

6 Mit dieser Backform können dann ganz konkret z.B. Marmorkuchen gebacken werden. In der Fachsprache sagt man: Ein Objekt ist eine Instanz einer Klasse.

7 Beispiel:

8 Backform Marmor- kuchen Geburts- tagskuchen von Rolf Klasse Objekt

9 Eine Klasse enthält Daten und Funktionen. Die Daten heissen Attribute, die Funktionen heissen Methoden. Der Sammelbegriff für Daten und Funktionen ist Member (Mitglieder).

10 Sinn: Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ändern der Attribute)

11 Beispiel in C++ (genaue Diskussion):

12 class Punkt{ private: int x; int y; public: void set_xy(int px, int py){ x = px; y = py; } int get_x(){ return(x); } int get_y(){ return(y); } }; // class Punkt Name der Klasse privater Bereich: Auf die Member des privaten Bereichs kann außerhalb der Klasse nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden. öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen. Bitte abschreiben !

13 class Punkt{ private: int x; int y; public: void set_xy(int px, int py){ x = px; y = py; } int get_x(){ return(x); } int get_y(){ return(y); } }; // class Punkt px bzw. py sind selbstsprechende Namen für Parameter x bzw. Parameter y

14 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } Tipp: Klassennamen immer mit einem Großbuchstaben beginnen. (Zwar erlaubt der Compiler auch einen Kleinbuchstaben, doch halten sich fast alle Programmierer an diese Regel.

15 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky

16 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35??

17 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? Fehlermeldung: x ist private (ein privater Bereich)

18 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35??

19 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? 79??

20 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? 79??

21 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? 79?? 797?

22 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? 79?? 797?

23 #include "stdafx.h" #include class Punkt{ //siehe oben }; int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y(); } p.xp.xp.yp.ykxky 35?? 79?? 797? 7979

24 Nochmals zu den Zugriffsrechten im folgenden kleinen Demo- Programm

25 class Punkt{ private: int x; int y; public: void set_x(int px){ x = px; } void set_y(int py){ y = py; } void set_xy(int px, int py){ set_y(py); set_x(px); } }; int main(){ Punkt p; p.x = 12; p.set_xy(2,3);} privater Bereich: Zugriff von außerhalb der Klasse: nein Zugriff innerhalb der Klasse: ja public (öffentlicher) Bereich : Zugriff von außerhalb der Klasse: ja Zugriff innerhalb der Klasse: ja // außerhalb, x private: nein // innerhalb, set_xy public: ja // innerhalb, x private: ja // außerhalb, set_xy public: ja // innerhalb, y private: ja

26 Aufgabe: Ergänzen Sie die Klasse Punkt mit weiteren Membern. (siehe Übungsaufgabenblatt)

27 Eine Klasse kann durch die sogenannte UML (Unified Modeling Language) beschrieben werden.

28 UML ist eine formale Sprache zur objektorientierten Spezifikation, Visualisierung, Konstruktion und Dokumentation von Softwaresystemen und Geschäftsmodellen.

29 Mit UML kann man z.B.die Klasse Punkt wie folgt darstellen:

30 Punkt - x: int - y: int + set_x(int px): void + set_y(int py): void + set_xy(int px, int py): void - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public Attribute Methoden

31 Warum soll man folgende Aussage befolgen ? Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ändern der Attribute)

32 Warum macht man diesen Umweg über die Methoden ? Warum greift man nicht direkt auf die Attribute zu ?

33 Schauen wir uns dazu ein paar Beispiele aus der täglichen Praxis an...

34

35 Warum benutzen wir an der Kasse im Supermarkt als Werkzeug den Kassierer, um auf die Kasse zuzugreifen ? Warum machen wir das nicht direkt (ohne den Kassierer) ?

36 Weil man dann den Kassenstand auf einen unerwünschten Wert verändern und einen ungewollten Ortswechsel der Kasse veranlassen kann!

37 Warum benutzen wir am Bankschalter als Werkzeug die EC-Karte, um auf die Kasse der Bank zuzugreifen ? Warum machen wir das nicht direkt (ohne Banker oder ohne EC-Karte) ?

38 Weil man dann den Kassenstand auf einen unerwünschten Wert verändern kann !

39 Warum wird in einigen Autos als Werkzeug das ABS-System benutzt ? Warum bremst man nicht direkt mechanisch (ohne Elektronik) ?

40 Weil man dann die Bremskraft auf einen unerwünschten Wert verändern kann (Bremsen blockieren)!

41 Warum wird in einigen Häusern als Werkzeug ein Thermostat verwendet, um die Temperatur zu regeln ? Warum macht man dies nicht direkt (einfüllen von Heizöl in den Ölofen) ?

42 Weil man dann z.B. in kürzester Zeit zu viel Heizöl in den Ofen leeren kann und es dann zu nicht gewünschten Verbrennungseffekten (Ofen explodiert !) kommen kann.

43 Weitere Beispiele:

44 Im Airbus, dem vollelektronischen Flugzeug, greift der Pilot nur über die Elektronik auf das Höhenruder, usw. zu

45 Die Opferbüchse in der Kirche besitzt eine Vorrichtung, die den Geldfluß nur in eine Richtung zuläßt.

46 Der Zugriff über die Boxhandschuhe auf den Körper des Gegners schützt diesen zumindest in einem gewissen Maße.

47 Die Verheiratung von Ehepartnern geschieht durch eine untere Verwaltungsbehörde. Dadurch sollen unerwünschte Vermählungen der handelnden Subjekte (enge Verwandtschaft, Artenschrankenüberschreitung) verhindert werden.

48 Diese Werkzeuge (Kassierer, EC-Karte, ABS-System, usw.) werden so gebastelt, daß sie es nicht erlauben, bestimmte Systemparameter (Geldmenge in Kasse, usw.) auf unerwünschte Werte abzuändern.

49 In C++ sind diese Werkzeuge Methoden, die es dem Klassen-Programmierer (= Programmierer, der Klassen verwendet) nicht erlauben, die Attribute auf unerwünschte Werte abzuändern.

50 Wenn eine Methode dies garantiert, nennt man dies auch Zusicherung (englisch: constraint)

51 Beispiel in C++:

52 class Konto{ private: double stand; public: void setKonto(double geld){ stand = geld; } void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; } }; // class Konto Name der Klasse privater Bereich: Auf die Member des privaten Bereichs kann außerhalb der Klasse nicht direkt, sondern nur indirekt über Methoden des public Bereichs dieser Klasse zugegriffen werden. öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

53 class Konto{ private: double stand; public: void setKonto(double geld){ stand = geld; } void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; } }; // class Konto int main(){ Konto k; k.setKonto(1000); k.abheben(7000); } k.stand : 1000

54 class Konto{ private: double stand; public: void setKonto(double geld){ stand = geld; } void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; } }; // class Konto int main(){ Konto k; k.setKonto(1000); k.abheben(7000); } k.stand : 1000 Zusicherung: Kontostand > -5000

55 In UML

56 Konto - stand: double + setKonto(double geld):void + abheben(double geld): void - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public {stand > -5000} Zusicherung

57 Programmierstil

58 Eine Methode kann man (rein syntaktisch, ohne dass sich irgendetwas inhaltlich ändert) auch ausserhalb einer Klasse implementieren.

59 Dies ist der bessere Programmierstil. Deshalb werden wir diesen zukünftig immer verwenden !

60 Dazu muss man den aber den vollständig qualifizierten Namen der Methode angeben.

61 Dies geschieht dadurch, dass man dem Methodenname den Klassennamen gefolgt von zwei Doppelpunkten voranstellt.

62 Beispiel:

63 class Punkt{ private: int x; int y; public: void set_xy(int px, int py){ x = px; y = py; } //... }; // class Punkt Dies ist der bisher bekannte Fall. Eine Methode kann aber auch ausserhalb der Klasse implementiert werden.

64 class Punkt{ private: int x; int y; public: void set_xy(int px, int py); }; // class Punkt void Punkt::set_xy(int px, int py){ x = px; y = py; }... und außerhalb der Klasse definiert (implementiert) werden unter Angabe des voll qualifizierten Namens. Dies ist ein der bessere Programmierstil ! Dazu muß die Methode in der Klasse deklariert werden (ohne Methodenkörper).


Herunterladen ppt "Objektorientierte Programmierung. In C: DatentypVariable Klasse Objekt ist eineVariable In C++ darf man einen Datentyp selbst basteln Dieser heisst dann:"

Ähnliche Präsentationen


Google-Anzeigen