64
Objektorientiert e Programmierung

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

Embed Size (px)

Citation preview

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

ObjektorientierteProgrammierung

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

In C:

Datentyp Variable<--->

Klasse <---> Objektist eineVariable

In C++ darf man einenDatentyp selbst basteln

Dieser heisst dann:

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

Kurz:Eine Klasse ist ein

höherer, selbstgebastelter Datentyp.

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

Genauer:

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

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.

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

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.

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

Beispiel:

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

BackformMarmor-kuchen

Geburts-tagskuchen von Rolf

Klasse <---> Objekt

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

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).

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

Sinn:Mit Hilfe der Methoden soll

man auf die Attribute zugreifen (lesen bzw. ändern

der Attribute)

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

Beispiel in C++(genaue Diskussion):

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

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 !

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

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

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

#include "stdafx.h"#include <stdio.h>

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.

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

Fehlermeldung:x ist private(ein privater Bereich)

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

7 9 ? ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

7 9 ? ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

7 9 ? ?

7 9 7 ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

7 9 ? ?

7 9 7 ?

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

#include "stdafx.h"#include <stdio.h>

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.x p.y kx ky

3 5 ? ?

7 9 ? ?

7 9 7 ?

7 9 7 9

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

Nochmals zu den Zugriffsrechten im

folgenden kleinen Demo-Programm

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

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: neinZugriff innerhalb der Klasse: ja

public (öffentlicher) Bereich : Zugriff von außerhalb der Klasse: jaZugriff 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

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

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

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

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

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

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

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

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

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

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

AttributeMethoden

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

Warum soll man folgende Aussage befolgen ?

“Mit Hilfe der Methoden soll man auf die Attribute

zugreifen (lesen bzw. ändern der Attribute)“

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

Warum macht man diesen Umweg über die Methoden ?

Warum greift man nicht direkt auf die Attribute zu ?

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

Schauen wir uns dazu ein paar Beispiele aus der

“täglichen“ Praxis an...

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

Schauen wir uns dazu ein paar Beispiele aus der

“täglichen“ Praxis an...

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

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) ?

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

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

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

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) ?

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

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

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

Warum wird in einigen Autos als “Werkzeug“ das ABS-System benutzt ?

Warum bremst man nicht direkt mechanisch (ohne Elektronik) ?

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

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

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

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) ?

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

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.

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

Weitere Beispiele:

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

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

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

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

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

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

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

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.

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

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.

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

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.

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

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

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

Beispiel in C++:

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

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.

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

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

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

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

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

In UML

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

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

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

Programmierstil

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

Eine Methode kann man (rein syntaktisch, ohne dass sich irgendetwas inhaltlich

ändert) auch ausserhalb einer Klasse implementieren.

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

Dies ist der bessere Programmierstil. Deshalb

werden wir diesen zukünftig immer verwenden !

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

Dazu muss man den aber den vollständig qualifizierten

Namen der Methode angeben.

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

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

voranstellt.

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

Beispiel:

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

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.

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

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).