Programmierkurs C++ Abstrakte Klassen und Methoden

Ähnliche Dokumente
Programmierkurs Java

Programmierkurs C++ Polymorphismus

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Vererbung und Polymorphie

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Einführung in die Programmierung

Programmierung Nachklausurtutorium

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Programmieren 2 Java Überblick

Programmieren in Java

Einstieg in die Informatik mit Java

Einführung in die Programmierung Wintersemester 2008/09

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Programmieren in Java

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Praxis der Programmierung

Einführung in die Programmiersprache Java II

1 Abstrakte Klassen, finale Klassen und Interfaces

Einführung in die Programmierung

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Java für Bauingenieure

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

14. Java Objektorientierung

Einführung in C# Teil 3. Matthias Nübling

Programmieren 1 09 Vererbung und Polymorphie

Vererbung Was versteht man unter dem Begriff Vererbung?

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Einführung in die Programmierung

Vererbung. Was versteht man unter dem Begriff Vererbung?

Abschnitt 14: Schnittstellen: Interfaces

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Abstrakte Basisklassen

Vorlesung Datenstrukturen

Algorithmen und Datenstrukturen

14. Java Objektorientierung

Kapitel 8 Vererbung. Korbinian Molitorisz. IPD Tichy Lehrstuhl für Programmiersysteme

Vorkurs Informatik WiSe 15/16

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Die verschiedenen Programmierparadigmen von C++ Software-Technik: Vom Programmierer zur erfolgreichen

Abstrakte Basisklassen

Wiederholung. Klassenhierarchie:

Kapitel 4: Klassen und Unterklassen

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Praktikum. SEP: Java-Programmierung WS 2018/19. Modularisierung. Thomas Lemberger und Martin Spießl

Java Einführung Vererbung und Polymorphie. Kapitel 13

Algorithmen und Datenstrukturen 07

Einführung in die Programmierung Wintersemester 2016/17

Enhanced Collection API

Klassen und Konstruktoren in Java

Präsentation Interfaces

Einstieg in die Informatik mit Java

Teil 2-3. Vorlesung. Modul: Programmierung B-PRG Grundlagen der Programmierung II

Liste Programmieren Java Überblick

Einstieg in die Informatik mit Java

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

1. Abstrakte Klassen

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Programmierkurs Java

Javakurs für Anfänger

Informatik II Übung 6

Java Einführung Abstrakte Klassen und Interfaces

Tafelübung 07 Algorithmen und Datenstrukturen

Universität Karlsruhe (TH)

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

6. Globalübung (zu Übungsblatt 8)

Objektorientierte Programmierung

Vererbung, Polymorphie

Abstrakte Klassen, Interface. DVG Abstrakte Klassen, Interface

Einführung in die Programmierung mit C++

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Polymorphie. 15. Java Objektorientierung II

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

4. Objektorientierte Programmierung mit C++

Einführung in die Programmierung

Polymorphie. 15. Java Objektorientierung II

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Java Vererbung. Inhalt

Programmieren in Java -Eingangstest-

Probeklausur: Programmierung WS04/05

Einführung in die Programmiersprache Java II

Universität zu Lübeck Institut für Telematik. Prof. Dr. Stefan Fischer

Vererbung und Polymorphie

Kapitel 5: Interfaces

Polymorphie und UML Klassendiagramme

Die Welt in unseren Programmen false -1.4E-12. false. Klassen

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Transkript:

Programmierkurs C++ Abstrakte Klassen und Methoden Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer

#2 Vererbungshierarchie Obst double getpreisineuro(); Apfel Birne Kiwi double getpreisineuro(); double getpreisineuro(); double getpreisineuro();

#3 Problem dieser Lösung Methode double getpreisineuro(); In den Klassen Apfel, Birne und Kiwi implementiert Aber auch in der Klasse Obst Welchen Sinn hat die Implementierung in Obst?

Oberklasse Obst: getpreisineuro() Bisherige Implementierung komplett sinnlos Die Methode wird sowieso in den Unterklassen überschrieben Macht sogar Probleme, wenn man Instanzen von Obst verwendet (Negativer Preis) Eigentlich brauchen wir die Klasse nur, damit wir die Methode double getpreisineuro() in Obst haben #4

#5 Weiteres Problem dieser Lösung Wer erzwingt eigentlich, dass man in Unterklassen die Methode getpreisineuro() überschreibt? Der Compiler tut es nicht (siehe Beispiel unten) Erstellt man eine Instanz von Apfel, wird die Methode aus Obst aufgerufen Die Methode wurde ja nicht überschrieben

#6 Lösung: Abstrakte Klassen / pure virtual Methoden C++ verfügt über das Konzept der abstrakten Klassen Abstrakte Klassen haben mindestens eine pure virtual Methode Pure virtual Methoden haben keine Implementierung Eine Klasse mit pure virtual Methoden kann nicht instanziiert werden Abstrakte Klassen bieten somit eine Schnittstelle an, welche von den Unterklassen implementiert wird Erzwingt die Implementierung der Methode in den Unterklassen Syntax virtual method-signature = 0; Beispiel class A { virtual void f() = 0; }; class B { virtual void f(const int x&) const = 0; };

#7 Beispiel: Abstrakte Klasse Obst Abstrakte Klassen: pure virtual Methoden Syntax: virtual <Rückgabe> funktion(<parameter>) = 0; Beispiel:

Beispiel: Abstrakte Klasse Obst Von abstrakten Klassen können keine Instanzen erzeugt werden Löst das erste der beiden Probleme Erzeugen von Instanzen wird vom Compiler verhindert #8

#9 Beispiel: Abstrakte Methode in Obst Obst enthält nun eine abstrakte Methode Die Signatur der Methode ist für alle Unterklassen definiert Signatur reicht aus, um Methode aufzurufen Wie sie intern funktioniert, ist egal

#10 Beispiel: Abstrakte Methode in Obst Unterklassen erben die abstrakte Methode Daher: Compilerfehler Unterklasse soll nicht abstrakt sein: Sie muss alle abstrakten Methoden implementieren

#11 Abstract und Vererbung Abstrakte Methoden werden vererbt Damit eine Klasse instanziiert werden kann (also nicht abstrakt ist), müssen in der Vererbungshierarchie alle abstrakten Methoden mit Implementierungen überschrieben werden Wo dies geschieht ist dabei egal

Abstract und die Früchte Klassen Apfel, Birne und Kiwi sind nicht abstrakt Implementieren die abstrakte Methode aus Obst Darüber kann man erzwingen, dass Programmierer bestimmte Methoden implementieren Damit realisiert man eine Schnittstelle Auch API (Application Programming Interface) genannt #12

Abstract und nicht-abstract mischen Nicht abstrakte Methoden können abstrakte Methoden verwenden Möglich, da bei nicht-abstrakten Instanzen von Unterklassen die Methode ja implementiert sein muss Damit können bestimmte Elemente der Implementierung offen gelassen werden Vorteil: Verhalten, das bei allen Unterklassen sehr ähnlich ist, kann in die Oberklasse verschoben werden #13

Beispiel (siehe nächste Folie) Beide Klassen implementieren die Methode getname unterschiedlich Methode tuewasmit(gutentag g) in der Klasse Main kennt nur das Interface von GutenTag Kann damit getname() oder stelldichvor() aufrufen stelldichvor() ruft getname der jeweiligen Instanz auf #14

#15

Interfaces In C++ können Klassen von mehreren Oberklassen erben Sogenannte Mehrfachvererbung In anderen Programmiersprachen ist dies nicht möglich (z.b. Java) Als Alternative werden sogenannte Interfaces angeboten Diese existieren in C++ nicht als eigenes Konstrukt / Schlüsselwort, sie können jedoch konzeptionell umgesetzt werden Ein Interface enthält lediglich Methodensignaturen D.h. keine Methodenimplementierung / kein Code In C++ kann dies durch eine Klasse umgesetzt werden, die ausschließlich abstrakte Methoden enthalten #16

Interfaces: Obstbeispiel Bei manchen Obstsorten ist Herkunftsland wichtig Methode Land getherkunftsland(); Soll (wenn bekannt) von Obstsorten implementiert werden Beispiel Kiwi Klasse Kiwi erbt von Obst und Herkunftsland #17

#18 Interfaces: Obstbeispiel Daher: Neue abstracte Klasse ( Interface ) Herkunftsland class Herkunftsland { public: Land* getherkunftsland() = 0; } Klasse Kiwi implementiert das Interface class Kiwi: public Obst, public Herkunftsland { Land* getherkunftsland() { return new Land( Neuseeland ); } }

Vererbungshierarchie Kiwi ist-ein Obst Herkunftsland Instanzen vom Typ Kiwi können per Typecast auf Obst und Herkunftsland abgebildet werden Obst Herkunftsland Beispiel Obst* obst = new Kiwi(); Herkunftsland* land = new Kiwi(); Kiwi Obst* obst2 = (Obst*) land; Herkunftsland* land2 = (Herkunftsland*) obst; #19

Zusammenfassung Abstrakte Klassen können nicht direkt instanziiert werden Abstrakte Methoden Erzwingen, dass in Unterklassen diese Methode implementiert werden muss, damit diese nicht mehr abstrakt sein müssen Resultat: Gemeinsame Schnittstelle bzw. Interface Interfaces Interfaces sind abstrakte Klassen mit ausschließlich abstrakten Methoden #20