Objektorientierte Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
1 Funktionstemplates Einbinden von Templates: –Eine *.o Datei, die durch Übersetzen einer Datei nur mit Templates erzeugt wurde, enthält keinen Programmcode.
Advertisements

Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.
Objektorientierte Programmierung
Funktionen.
Kapselung , toString , equals , Java API
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
Vererbung.
Abstrakte Klassen.
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Ein Beispiel in Java.
Objektorientierte Programmierung
Dynamischer Speicher und Struktur
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Aufgabe: Erstellen Sie die Klasse Punkt, (mit den entsprechenden Attributen und Methoden), die einen Punkt (Pixel) in einer grafischen zweidimensionalen.
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Vererbung. Das Prinzip der Vererbung im täglichen Leben:
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Abstrakter Datentyp in C++ I - Klasse -
Objektorientierte Programmierung
Packages Vortrag : Cornelia Hardt 23. November 1999.
C++ Vererbung und Polymorphie
DVG Klassen und Objekte
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Programmierung im Netz und Internet: Einführung in die Programmiersprache Java Teil I 1 Klassen Objekte von.
UML Begleitdokumentation des Projekts
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
UML WS 09/10: Datenbanken vs MarkUp Dozent: Prof. Dr. Manfred Thaller
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Objektorientiertes Konstruieren
Programmiervorkurs WS 2014/15 Instanzmethoden
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
early binding (frühe Bindung) late binding (späte Bindung)
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Abstrakte Klassen und das Interface-Konzept
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Vortrag Einführung in AspectJ. Gliederung 1 Einleitung 2 Querschnittsfunktionalitäten in AspectJ 2.1 Sprachelemente 3 Beispiel 4 Join Point Modell 5 Weaving.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Tutorium Software-Engineering SS14 Florian Manghofer.
Konstruktoren.
Grundkurs Informatik 11-13
November 18 Informatik Kurse
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
REKURSION + ITERATION.
Implementieren von Klassen
Grundkurs Informatik 11-13
Juli 19 Informatik Kurse
 Präsentation transkript:

Objektorientierte Programmierung

Datentyp selbst basteln In C: Datentyp <---> Variable In C++ darf man einen Datentyp selbst basteln Dieser heisst dann: Klasse <---> Objekt ist eineVariable

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

Genauer:

Eine Klasse ist ein Bauplan (vergleichbar: Backform) 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.

Mit dieser Backform können dann ganz konkret z. B 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.

Beispiel:

Klasse <---> Objekt Geburts- tagskuchen von Rolf Backform Marmor- kuchen

Eine Klasse enthält Daten und Funktionen 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).

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

Beispiel in C++ (genaue Diskussion):

Bitte abschreiben ! 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 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. Name der Klasse öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen. Bitte abschreiben !

void set_xy(int px, int py){ x = px; y = py; } int get_x(){ return(x); 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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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.

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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 ?

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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)

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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 ?

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

#include <stdio.h> class Punkt{ //siehe oben }; int main(){ #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

Nochmals zu den Zugriffsrechten im folgenden kleinen Demo-Programm

void set_xy(int px, int py){ set_y(py); set_x(px); }; int main(){ 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 // innerhalb, x private: ja // innerhalb, y private: ja // innerhalb, set_xy public: ja public (öffentlicher) Bereich : Zugriff von außerhalb der Klasse: ja Zugriff innerhalb der Klasse: ja // außerhalb, x private: nein // außerhalb, set_xy public: ja

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Weitere Beispiele:

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

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

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

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.

Diese Werkzeuge (Kassierer, EC-Karte, ABS-System, usw 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.

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.

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

Beispiel in C++:

void setKonto(double geld){ stand = geld; } void abheben(double geld){ 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 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. Name der Klasse öffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

void setKonto(double geld){ stand = geld; } void abheben(double geld){ 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

void setKonto(double geld){ stand = geld; } void abheben(double geld){ 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); Zusicherung: Kontostand > -5000 k.stand : 1000

In UML

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

Programmierstil

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

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

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

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

Beispiel:

Dies ist der bisher bekannte Fall. 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.

void set_xy(int px, int py); }; // 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; } Dazu muß die Methode in der Klasse deklariert werden (ohne Methodenkörper). ... und außerhalb der Klasse definiert (implementiert) werden unter Angabe des voll qualifizierten Namens. Dies ist ein der bessere Programmierstil !