Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.

Slides:



Advertisements
Ähnliche Präsentationen
C Sharp (C#) Martin Saternus Senior Student Partner
Advertisements

der Universität Oldenburg
1 Funktionstemplates Einbinden von Templates: –Eine *.o Datei, die durch Übersetzen einer Datei nur mit Templates erzeugt wurde, enthält keinen Programmcode.
Objektorientierte Programmierung
Konzepte objektorientierter Systeme
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Finale Semantik und beobachtbares Verhalten
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
Erweiterte Zuweisungskompatibilität
Polymorphie (Vielgestaltigkeit)
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Programmieren mit JAVA
Programmieren mit JAVA
Abstrakter Datentyp in C++ I - Klasse -
C++ Standardbibliothek
Objektorientierte Programmierung
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
C++ Vererbung und Polymorphie
DVG Einführung in Java1 Einführung in JAVA.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Prof. Dr. Gerhard Schmidt pres. by H.-J. Steffens Software Engineering SS 2009Folie 1 Objektmodellierung Objekte und Klassen Ein Objekt ist ein Exemplar.
Einführung in die Programmierung
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Entwurfs- und Implementationsdiagramme
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
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 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 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
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.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Informatik 1 Letzte Übung.
Informatik Objekte und Klassen 1. Objektorientiertes Modellieren und Programmieren 1.1 Objekte und Klassen.
Informatik Zustandsorientiertes Modellieren und Programmieren 2.4 Datenkapselung 2.4 Datenkapselung Objekte können miteinander kommunizieren, indem.
2. Zustandsorientiertes Modellieren 2.4 Datenkapselung
EPROG Tutorium #5 Philipp Effenberger
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
Java-Kurs - 6. Übung Besprechung der Hausaufgabe
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Einführung in die Programmierung mit Java
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
Abstrakte Klassen und das Interface-Konzept
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
OOP II.
Objektorientierte Programmierung und Vererbung
1. Die rekursive Datenstruktur Liste 1
Grundkurs Informatik 11-13
Polymorphie Überschreiben
 Präsentation transkript:

Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt werden, da alle für die Aufgabenstellung interessanten Objekte nur von den abgeleiteten Klassen erzeugt werden. Diese abstrakten Klassen dienen ausschließlich als Ober- oder Basisklassen. Beispiel: class GraphObj { public: virtual void drawObj( ) const; // und weitere Methoden private: // und Elemente }; class Square : public GraphObj { class Circle: public GraphObj { Breymann_Folien

Abstrakte Klassen Bei der 3D-Darstellung von gewissen Szenen mittels der Computergraphik würde man nur konkrete graphische Objekte, die man zeichnen kann, also Quadrate, Kreise (Dreiecke: eine weitere Unterklasse von GraphObj) generieren und zeichnen. Es würde kein „konkretes“ Objekt der Klasse GraphObj generiert werden. Das syntaktische Mittel um eine Klasse zur abstrakten Klasse zu machen, sind rein virtuelle Funktionen. Abstrakte Klassen haben mindestens eine rein virtuelle Funktion: class GraphObj { public: virtual void drawObj( ) const = 0; // und weitere Methoden private: // und Elemente }; Durch Ergänzung „ = 0“ wird die Funktion zur rein virtuellen Funktion. Breymann_Folien

Abstrakte Klassen Klassen, von denen Objekte erzeugt werden können, nennt man konkrete Klassen. Klassen, von denen keine Objekte erzeugt werden können, nennt man abstrakte Klassen. Rein virtuelle Funktionen besitzen keine Implemen-tierungen in der abstrakten Klasse. Wenn eine konkrete Klasse von einer abstrakten Klasse abgleitet ist, so muss sie konkrete Implementierungen für die rein virtuellen Funktionsprototypen zur Verfügung stellen. Man beachte: Fehlt die konkrete Implementierung einer rein virtuellen Funktion in einer abgeleiteten Klasse, so ist die Klasse auch eine abstrakte Klasse. Breymann_Folien

Mehrfachvererbung Eine Klasse kann von mehreren anderen Klassen abgeleitet werden und „erben“: class Multierbe: public Basisklasse1, public Basisklasse2 { // das Übliche } Die Basisklassen werden durch Kommata getrennt. Für Beispiele siehe Breymann-Skript Seite 341++. Breymann_Folien

Teil-Ganzes- oder Hat-Beziehung oder Aggregation im Englischen: Ein Objekt einer Klasse kann Objekte von anderen Klassen als Teile enthalten. Als Beispiel betrachten wir hier eine (zweidimensionale) Linie mit einem Anfangs- und einem Endpunkt: #include “graphObj.h“ #include “point2D.h“ class Line: public GraphObj { public: Point2D& getStartPoint( ); Point2D& getEndPoint( ); virtual drawObj( ) const; // plus other useful methods private: Point2D startPoint; Point2D endPoint; } Man spricht von einer „Hat“-Beziehung, da die Linie einen Anfangs- und einen Endpunkt hat. Eine Linie ist ein graphisches Objekt . Deshalb wird die Klasse Line von der Klasse GraphObj abgeleitet. Breymann_Folien

Überladen von Operatoren Den vordefinierten Operatorsymbolen in C++ kann man für Klassen neue Bedeutungen zuordnen. Dies ermöglicht es dem Nutzer gewisse Operationen sehr kompakt zu schreiben. Wir sprechen wie bei Funktionen auch bei den Operatoren vom Überladen (von Operatoren). Überladen werden können die üblichen Operatoren in C++, wie zum Beispiel =,==,+=, +, *, / usw. mit Ausnahme von . .* :: ?: Wir verwenden das Symbol  als Platzhalter für die verschiedenen Operatoren in C++. Bei einer globalen Funktion ist die Syntax eines Operatoraufrufs Rückgabetyp operator(Argumentliste) { Funktionsblock } Bei einer Elementfunktion ist die Syntax eines Operatoraufrufs Rückgabetyp Klassenname::operator(Argumentliste) { Funktionsblock } Für die Syntax von Operatoren und die Funktionsaufrufe, die der Compiler mittels der Operatoren tätigt, siehe Seite 369 im Breymann-Skript. Breymann_Folien

Überladen von Operatoren Als Beispiel fügen wir zu unserem Klassentemplate Point2D<T> Operatoren hinzu, so dass wir mit den zweidimensionalen Punkten wie mit komplexen Zahlen rechnen können. template<typename T> class Point2D { public: T X( ) const; T Y( ) const; void changeCoordinates( T x , T y); Point2D<T> operator+(const Point2D<T>& p); // neuer Operator + Point2D<T> operator*(const Point2D<T>& p); // neuer Operator * bool operator==(const Point2D<T>& p); // neuer Operator == private: T xCoordinate; T yCoordinate; }; // globale Funktion zur Ausgabe std::ostream& operator<<(std::ostream&, const Point2D<T>& ); #endif Breymann_Folien

Überladen von Operatoren Implementierungen der Operatoren template<typename T> Point2D<T> Point2D<T>::operator+(const Point2D<T>& p) { Point2D<T> sum; sum.xCoordinate = this->xCoordinate + p.xCoordinate; sum.yCoordinate = this->yCoordinate + p.yCoordinate; return sum; } Breymann_Folien

Überladen von Operatoren // Multiplikation template<typename T> Point2D<T> Point2D<T>::operator*(const Point2D<T>& p) { Point2D<T> product; product.xCoordinate = this->xCoordinate * p.xCoordinate – this->yCoordinate * p.yCoordinate; product.yCoordinate = this->xCoordinate * p.yCoordinate + this->yCoordinate * p.xCoordinate; return product; } Breymann_Folien

Überladen von Operatoren // Vergleichsoperator == bool Point2D<T>::operator==(const Point2D<T>& p) { return ((this->xCoordinate == p.xCoordinate) && (this->yCoordinate == p.yCoordinate)); } // Ausgabe: ist keine Methode von Point2D<T>, // sondern eine globale Funktion ostream& operator<<(ostream& s, const Point2D<T>& p) { s << “(“ << p.X() << “,“ << p.Y() << “)“; return s; Breymann_Folien

Überladen von Operatoren Wenn wir die Koordinaten eine Punktes p (Point2D) mit dem Befehl cout << p; ausgeben wollen, so können wir den Operator << nur als eine globale Funktion deklarieren und definieren, denn ansonsten müsste die Operatorfunktion eine Elementfunktion der Klasse ostream sein: cout.operator<<(p); // Fehler, da eine solche Elementfunktion mit // Parameter Point2D<T> in der Klasse ostream // nicht existiert. Folglich haben wir für die Syntax cout << p (cout  p = x  y) nur die Möglichkeit eine globale Operatorfunktion zu definieren: std::ostream& operator<<(std::ostream& , const Point2D<T>& ) ; Breymann_Folien