Tutorium Software-Engineering SS14 Florian Manghofer.

Slides:



Advertisements
Ähnliche Präsentationen
Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.
Advertisements

Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Konzepte objektorientierter Systeme
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Abstrakte Klassen.
Erweiterte Zuweisungskompatibilität
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,
Konstruktoren.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Polymorphie (Vielgestaltigkeit)
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 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
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
Zusammenfassung Vorwoche
Abstrakter Datentyp in C++ I - Klasse -
Abstrakte Klassen DVG
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.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
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 Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
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 Informatik für Naturwissenschaftler und Ingenieure
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 2008/09 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 Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
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)
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Einführung in die Programmierung mit Java
Erweiterte Zuweisungskompatibilität. Wie kann man Objekte verschiedener Klassen einer Klassenhierarchie einander zuweisen ?
Abstrakte Klassen und das Interface-Konzept
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
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.
Tutorium Software-Engineering SS14 Florian Manghofer.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Konstruktoren.
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Vererbung.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
OOP II.
Programmierung und Vererbung in Java
Einführung in die Programmierung
Implementieren von Klassen
Grundkurs Informatik 11-13
Polymorphie Überschreiben
 Präsentation transkript:

Tutorium Software-Engineering SS14 Florian Manghofer

Polymorphismus Polymorphismus (Vielgestaltigkeit) Abgeleitete Klasse erbt Methoden und Attribute der Elternklasse(n) Wenn jedoch eine Methode der Basisklasse nicht die gewünschte Funktionalität für die abgeleitete Klasse liefert, so kann diese überschrieben werden Eine überschriebene Methode ist im Sinne der Polymorphismus: eine Methode, die in einer Basisklasse definiert wurde mit derselben Signatur und demselben Rückgabewert in einer abgeleiteten Klasse definiert wurde Beispiel siehe Skript Seite.40/41 Wenn es erst während der Programmausführung entschieden wird welche Methode aufgerufen werden soll, so nennt man diesen Vorgang dynamisches oder spätes Binden.

Typenkonvertierung Virtuelle Methoden wird erst zur Laufzeit ausgewählt Implizite Typenkonvertierung Ein Objekt, ein Zeiger oder eine Referenz einer abgeleiteten Klasse kann einem Objekt, einem Zeiger oder einer Referenz seiner Basisklasse zugewiesen werden. Dabei findet eine implizite Typkonvertierung statt (gilt nicht umgekehrt). Bei Objekten gehen die zusätzlichen Daten der abgeleiteten Klasse verloren, der Basisklassenanteil wird kopiert.

Typenkonvertierung Implizite Typenkonvertierung Beispiel: class KFZ{ private: int ps; string name; public: KFZ(int pps,string nname):ps(pps),name(nname){}; void ausgabe(){ cout <<„PS:“ << this.ps << endl; cout << „Name: „ <<this.name << endl; } class Auto: public KFZ{ private: int anzahlPassagiere; public: Auto(int ps, string name, int aP){ KFZ(ps,name); this.anzahlPassagiere = aP; void ausgabe(){ cout << „Daten: “ <<this.ps << „ :“ << this.name << endl; cout << „Passagiere: „ << this.anzahlPassagiere << endl; }

Typenkonvertierung Implizite Typenkonvertierung Beispiel: int main(){ Auto *a1 = new Auto(120, „AUDI“,5); a1->ausgabe(); KFZ *k1 = a1; k1->ausgabe(); return 1; } Daten: 120 : AUDI Passagiere: 5 PS: 120 Name: AUDI a1 zeigt auf ein Objekt vom Typ Auto. Der Zeiger k1 vom Typ KFZ zeigt ebenfalls auf das Objekt vom Typ Auto. (über a1) Da der Zeiger k1 aber vom Typ KFZ ist, wird die Methode ausgabe() auch von KFZ aufgerufen, obwohl das Objekt eigentlich vom Typ Auto ist. (Umgekehrt funktioniert das nicht, weil die abgeleitete Klasse die Methoden der Elternklasse Enthält, aber die Elternklasse nicht die der Kindklasse.)

dynamisches Binden Wie im Beispiel gezeigt, bestimmt der Typ des Zeigers, welche Methode verwendet wird. Wir wollen aber einen allgemeinen Zeiger, der es uns ermöglicht, unterschiedliche Objekte zu verwalten, also z.B. KFZ und Auto und der dabei die richtige Methode, passend zum Objekttyp auswählen soll.  Der Objekttyp soll bestimmen, welche Methode gewählt wird, nicht der Typ des Zeigers!!!  Lösung durch virtuelle Methoden Dazu muss die entsprechende Methode/Methoden zumindest in der Basisklasse mit dem Schlüsselwort virtual gekennzeichnet werden. In diesem Beispiel betrifft dies die Methode ausgabe(): virtual void ausgabe(){…} Tipp: am besten auch in den Kindklassen mit virtual arbeiten. Erleichtert die Lesbarkeit!

dynamisches Binden Dynamisches Binden Beispiel: class KFZ{ private: int ps; string name; public: KFZ(int pps,string nname):ps(pps),name(nname){}; virtual void ausgabe(){ cout <<„PS:“ << this.ps << endl; cout << „Name: „ <<this.name << endl; } }; class Auto: public KFZ{ private: int anzahlPassagiere; public: Auto(int ps, string name, int aP):KFZ(ps,name),passagiere(p){}; virtual void ausgabe(){ cout << „Daten: “ <<this.ps << „ :“ << this.name << endl; cout << „Passagiere: „ << this.anzahlPassagiere << endl; } };

dynamisches Binden Dynamisches Binden Beispiel: int main(){ Auto *a1 = new Auto(120, „AUDI“,5); a1->ausgabe(); KFZ *k1 = a1; k1->ausgabe(); return 1; } Daten: 120 : AUDI Passagiere: 5 Jetzt bestimmt nichtmehr der Typ des Zeigers, welche Methode aufgerufen wird, sondern der Typ des Objektes. k1 ist zwar vom Typ KFZ, jedoch zeigt es auf ein Objekt vom Typ Auto. Da die Methode ausgabe() nun virtual ist, wird die Methode ausgabe() der Auto-Klasse aufgerufen, da das Objekt ja von diesem Typ ist. Diesen Vorgang nennt man dynmaisches Binden oder spätes Binden. Daten: 120 : AUDI Passagiere: 5

dynamisches Binden Allgemeiner Zeiger Hierarchie KFZ Beispiel: int main(){ KFZ *k1 = new Auto(120, „AUDI“,5); k1->ausgabe(); k1 = new LKW(„300“,“MAN“,“7t“,“80km/h“); k1->ausgabe(); k1 = new Zweirad(„15“,“BMW“,“130km/h“); k1->ausgabe(); return 1; } Angenommen, wir haben zusätzlich noch eine Klasse LKW und Zweirad, die jeweils von der Klasse KFZ erben. Diese besitzen ebenfalls die ausgabe() Methode als virtual. Nun wollen wir nur mit einem Zeiger diese verwalten. ausgabe() Methode von Auto ausgabe() Methode von LKW ausgabe() Methode von Zweirad

polymorphe Klassen Eine Klasse mit virtuellen Methoden wird polymorphe Klasse genannt. Ein derartiges dynamisches Verhalten bei Methoden funktioniert nur, wenn die entsprechenden Methoden, bei denen dies gewünscht ist, als virtual gekennzeichnet sind. virtual wirkt nur, wenn die so gekennzeichnete Methode in der abgeleiteten Klasse exakt die gleiche Schnittstelle (Methodenname + Rückgabetyp + Parameterliste) besitzt. Ausnahme: Ist der Rückgabetyp eine Referenz oder ein Zeiger auf die Basisklasse, dann darf der Rückgabetyp in der abgeleiteten Klasse eine Referenz oder ein Zeiger auf die abgeleitete Klasse sein.