Das Interface-Konzept am Beispiel der Sprache Java

Ähnliche Dokumente
12 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces

Informatik II Übung 6

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

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

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

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

Präsentation Interfaces

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

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Die abstrakte Klasse Expression:

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Vererbung und Polymorphie

Vorkurs Informatik WiSe 15/16

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

Programmierung Nachklausurtutorium

Einstieg in die Informatik mit Java

Einführung in die Programmierung

Programmierkurs Java

Objektorientierte Programmierung. Kapitel 14: Interfaces

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Programmieren in Java

Wiederholung. Klassenhierarchie:

Info B VL 8: Abstrakte Klassen & Interfaces

1 Einleitung Generizität Syntax... 2

Einführung in die Programmierung

Ein Vortrag im Rahmen des Wahlpflichtmoduls Fortgeschrittene Programmierung mit JAVA

14 Abstrakte Klassen, finale Klassen, Interfaces

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmieren in Java

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

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

Java Vererbung. Inhalt

Informatik II Übung 06. Benjamin Hepp 5 April 2017

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

Vererbung, Polymorphie

Abschnitt 14: Schnittstellen: Interfaces

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Informatik II Übung 6 Gruppe 7

Programmieren I. Kapitel 8. Vererbung

Java Einführung Vererbung und Polymorphie. Kapitel 13

Interfaces und Vererbung

Kapitel 5: Interfaces

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

Fragen zur OOP in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmieren in Java -Eingangstest-

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

Programmieren 2 Java Überblick

Sommersemester Implementierung I: Struktur

Einführung in die Programmiersprache Java II

Einstieg in die Informatik mit Java

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

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

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

Einführung in die Programmierung

Objektorientierte Programmierung Studiengang Medieninformatik

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

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Schnittstellen, Vererbung & Polymorphismus für Fortgeschrittene

Programmieren 1 09 Vererbung und Polymorphie

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

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Vererbung. CoMa-Übung XI TU Berlin. CoMa-Übung XI (TU Berlin) Vererbung / 47

Objektorientierte Programmierung Studiengang Medieninformatik

Algorithmen und Datenstrukturen 07

Tafelübung 07 Algorithmen und Datenstrukturen

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

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

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

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

Abstrakte Klassen, Interface. DVG Abstrakte Klassen, Interface

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

3 Objektorientierte Konzepte in Java

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

HERZLICH WILLKOMMEN PROGRAMMIERKURS (JAVA) ZUM. Dr. Vera Weil Institut für Informatik Universität zu Köln. 9. Vorlesung (05.

7. Übung Informatik II - Objektorientierte Programmierung

Factory Patterns und deren Auswirkung auf die Softwarearchitektur in der Praxis

Polymorphie. 15. Java Objektorientierung II

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Implementieren von Klassen

Polymorphie. 15. Java Objektorientierung II

Vorlesung Datenstrukturen

Grundlagen der Informatik

Johannes Unterstein - TINF16 - Java - Sommersemester 2017 JAVA. Weiterführende Spracheigenschaften

Abstrakte Basisklassen

C++ - Objektorientierte Programmierung Polymorphie

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Javakurs für Anfänger

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Javakurs für Anfänger

Polymorphie Begriffsklärung und Anwendung

Exceptions und Vererbung

Transkript:

Das Interface-Konzept am Beispiel der Sprache Java Klaus Kusche, November 2013

Inhalt Motivation: Wozu braucht man Interfaces? Interfaces in Java Was spricht gegen die große Lösung?

Voraussetzungen Kenntnisse der Objektorientierung: Klassen... und deren praktische Anwendung zur Strukturierung von Code! Vererbung Abstrakte Klassen

Praktische Erkenntnis Klassen beschreiben die Funktionalität von Objekten Oft haben Objekte ganz verschiedener Klassen idente (Teil-) Funktionalitäten

Beispiele (1) Funktionalität vergleichbar : Die Objekte der Klasse sind größenmäßig vergleichbar (d.h. es gibt so etwas wie ein < ) Gilt für Zahlen, Strings, Datum & Zeit, selbstdefinierte Objekte,... Als Comparable vordefiniert in Java, Bedeutung: Es gibt eine Methode compareto(...) ==> -1, 0, 1

Beispiele (2) Funktionalität sortierbar : Die Objekte der Klasse enthalten mehrere Werte und bieten eine Methode sort() zum Sortieren Funktionalität durchlaufbar : Die Objekte der Klasse enthalten mehrere Werte und bieten z.b. Methoden getfirst() und getnext(...) (ähnlich in Java: Enumeration bzw. Iterable ) Beides (meist, nicht immer!) gilt für zahlreiche strukturell verschiedene Datenstrukturen (Array, Liste, Baum,...)

Beispiele (3) Funktionalität Runnable (Java): Die Objekte der Klasse bieten eine Methode run(), mit der ein paralleler Thread gestartet werden kann. Funktionalität Serializable (Java): Die Objekte der Klasse sind in einen Byte-Strom verwandelbar (und damit in einer Datei speicherbar, via Netz versendbar,...)

Gemeinsame Eigenschaften Derartige Funktionalitäten sind...... nach außen durch eine Schnittstelle charakterisiert = Vorhandensein bestimmter Methoden... nicht an eine bestimmte Datendarstellung gebunden... unabhängig von anderen Methoden der Klasse (und deren Implementierung)... nur ein kleiner Teil der Gesamt-Funktionalität einer Klasse (meist 1 bis 5 Methoden, fast nie mehr!)... erblich (gelten auch für abgeleitete Klassen)

Erster Implementierungs-Versuch Für jede solche Funktionalität: Definiere eine gemeinsame, abstrakte Basisklasse Deklariere alle Klassen mit dieser Funktionalität als davon abgeleitet

Was ist dafür nötig? Viele Klassen vereinigen mehrere / viele solcher Funktionalitäten! (z.b. String : vergleichbar, durchlaufbar, serialisierbar,...) Ziel von O-O ist u.a.: Doppelten Code vermeiden! ==> Die Hauptvererbungslinie sollte interne Datendarstellung & gemeinsamen Code weitergeben, nicht nur Schnittstellen (z.b. String ist Erweiterung von Sequence oder Vector,...) ==> Eine Klasse müsste von mehreren Klassen gleichzeitig abgeleitet sein!

Allgemeine Mehrfach-Vererbung...... wird in einigen Programmiersprachen unterstützt (vor allem in C++: Keine Interfaces, nur Mehrfach-Vererbung!)... kann das Problem tatsächlich lösen... wird zur Implementierung solcher Fälle verwendet (der Großteil aller Mehrfach-Vererbungen wird nur für solche Funktionalitäten verwendet)... kann viel mehr als dafür notwendig... ist extrem kompliziert (konzeptionell und implementierungstechnisch) ==> siehe letztes Kapitel!

Java (und C#) will einfach sein! ==> Mehrfach-Vererbung so einschränken, dass sie...... verständlich und nachvollziehbar ist... leicht implementierbar bleibt... diese Fälle immer noch komfortabel löst (aber viele ausgefallenere Anforderungen nicht mehr) ==> Interfaces (deutsch: Schnittstellen ) sind eine eingeschränkte Form (aber die praktisch wichtigste/häufigste Form!) der Mehrfach-Vererbung nur für gemeinsame Schnittstellen!

Interfaces in Java Idee und Konzept Deklaration Verwendung in Klassen Verwendung in Deklarationen Prüfung zur Laufzeit Leere Interfaces Interface-Hierarchien Sonderfälle

Trenne zwischen Idee reiner Typ-Vererbung = Interface (nur Methoden-Deklarationen) ==> Mehrfach-Vererbung erlaubt! kompletter Implementierungs-Vererbung = normale Klasse (mit Code & Daten) ==> Nur einfache Vererbung erlaubt!

Konzept: Ein Interface...... ist eine eingeschränkte Form einer abstrakten Klasse ==> Objekte eines Interfaces sind nicht direkt erzeugbar, nur Objekte davon abgeleiteter Klassen! ==> Erbt eine Klasse ein Interface, so bleibt sie ebenfalls so lange abstrakt, bis sie für alle Methoden des Interfaces Code defininiert hat! (d.h. alle Methoden eines Interfaces müssen überschrieben werden!)

Die Deklaration eines Interfaces...... beginnt mit dem Schlüsselwort interface statt class... darf nur enthalten: Die Deklarationen - von public-methoden - und von Konstanten... darf keinen Code enthalten... darf keine Member-Variablen enthalten... darf keinen Konstruktor / Destruktor enthalten... darf keine statischen Methoden enthalten

Hinweise zur Deklaration abstract (beim Interface), public (bei allen Deklarationen) und static final (bei Konstanten) sind implizit (weil ohnehin die einzig erlaubte Möglichkeit) ==> Nicht hinschreiben! Generics (Typ-Parameter) sind auch bei Interfaces möglich.

Deklaration, Beispiel interface Sortable { // sortiere das eigene Objekt void sort(); }

Verwendung in Klassen Terminologie: Daher: Bei Interfaces heißt es implementieren, nicht erben! class myclass extends mybaseclass implements myinterf1, myinterf2,... {... } In Java: Eine Vaterklasse, aber beliebig viele Interfaces! Implementierte Interfaces werden automatisch weitervererbt!

Verwendung in Deklarationen Interface-Namen sind (wie Klassennamen) Typnamen ==> Können zur Deklaration von Objekt-Variablen verwendet werden (im Besonderen auch von Parametern) ==> Die Variable kann dann eine Referenz auf ein Objekt einer beliebigen Klasse enthalten, die dieses Interface implementiert Beispiel: void StartAndJoin(Runnable r) {...

Prüfung zur Laufzeit Analog zur Prüfung auf Klassen-Zugehörigkeit: Prüfung, ob ein Objekt ein bestimmtes Interface implementiert: liefert true / false obj instanceof interf

Leere Interfaces Java erlaubt leere Interfaces (ohne Methoden) (inzwischen teilweise ersetzt durch Annotationen) Sinn: Indikator für das Vorhandensein bestimmter Eigenschaften ==> Primär zum Test mit instanceof Bezeichnung: Marker Interfaces ( Markierungsschnittstellen ) Beispiele: Cloneable ( deep Copy mittels clone möglich) Serializable (in Byte-Strom verwandelbar)

Interface-Hierarchien Kann man Interfaces auch voneinander ableiten? Kann man bestehende Interfaces um neue Methoden erweitern? Ja! Aber diesmal mit extends, nicht mit implements : interface extinterf extends baseinterf {... } Hier ist sogar Mehrfach-Vererbung erlaubt:... extends baseinterf1, baseinterf2,... Beispiel: Bidirektional durchlaufbar = durchlaufbar + getprev

Sonderfälle (1): Was passiert bei...... selber Methode in mehreren implementierten Interfaces? ==> Erlaubt, bezeichnet ein und dieselbe Methode!... selber Konstante in mehreren implementierten Interfaces? ==> Fehlermeldung bei direkter Verwendung! (auch bei gleichem Wert!) ==> Erlaubt mit expliziter Angabe des Interfaces: interf.const ==> Verwirrt, am besten vermeiden!

Sonderfälle (2): Was passiert bei...... Komplexen Konstanten (Initialwert zur Laufzeit berechnet)? ==> Möglich, aber kompliziert und verwirrend ==> Auf echte Konstanten beschränken! ==> Dynamisch erzeugte Objekte meiden!

Probleme Mehrfach-Vererbung (1) C++: Werden zwei Methoden mit identem Aufruf von zwei Vaterklassen geerbt, so sind es zwei verschiedene Methoden! (können auch verschiedenen Code haben!) ==> Welche wird aufgerufen??? ==> Praktische Faustregel: Muss überschrieben werden! Wenn nicht überschrieben: Aufruf von außen liefert Fehler! (d.h. die Klasse verletzt ihre Schnittstelle!) ==> Es gibt kein super in C++! Bei jedem Vaterklassen-Methoden-Aufruf muss die gewünschte Vaterklasse explizit angegeben werden!

Probleme Mehrfach-Vererbung (2) Analog für von zwei Vaterklassen geerbte Member gleichen Namens: Sind zwei verschiedene Member! ==> Normaler Zugriff -... ist nicht eindeutig -... liefert daher einen Fehler! ==> Bei jedem un-eindeutigen Member-Zugriff muss die Vaterklasse explizit dazugeschrieben werden!

Probleme Mehrfach-Vererbung (3) Die diamantene Vererbung : Dieselbe Großvater-Klasse wird über zwei verschiedene Vaterklassen geerbt. ==> Sind ihre Member jetzt einfach oder doppelt in jedem abgeleiteten Objekt gespeichert??? (in C++: Per default doppelt, mit virtual einfach) ==> Wenn doppelt: - Bei Zugriff auf geerbte Member - Bei Typumwandlung auf den Großvater-Typ Welches der beiden? (explizite Angabe nötig!)

Probleme Mehrfach-Vererbung (4) Implementierungstechnische Probleme: Member mehrerer Vaterklassen müssen in einem abgeleiteten Objekt Speicherplatz bekommen ==> Geerbte Member müssen frisch angeordnet werden ==> Dasselbe Member steht innerhalb des Objektes in verschiedenen Klassen an verschiedenen Offsets! ==> Der Code zum Zugriff wird viel komplizierter: Er muss zuerst die Objektklasse auswerten!

The end Fragen?