Interfaces - HAW Hamburg

Werbung
Einführung in Java
Präsentation
Interfaces
Nozar Delassaei Marvi
Inhalt
1. Erinnerung
Klasse
Objekte
Beispiel Klasse
Abstrakte Klasse
Beispiel Abstrakte Klasse
Mehrfachvererbung-1
Mehrfachvererbung-2
2. Interfaces
Definition, Implementierung und Verwendung von Interfaces
Das Interface Comparable
Implementierung mehrerer Interfaces
Vererbung von Interfaces
Ableiten von Interfaces
Konstanten in Interfaces und static imports
Flag-Interfaces
Methode clone
Nachbildung von Funktionszeigern
Die Default-Implementierung eines Interface
Delegation an eine Default-Implementierung
Nozar Delassaei Marvi / HAW Hamburg
2
Klasse
// Klasse: Eine Klasse beinhaltet
Datenmember und Methoden, wie diese
zu bearbeiten sind.
// Die Datei muss dann den Namen der
öffentlichen Klasse zuzüglich der
Extension .java tragen.
// Nach der Übersetzung durch den
Compiler hat das Ergebnis die Extension
.class.
Nozar Delassaei Marvi / HAW Hamburg
3
Objekte
Was ist ein „Objekt“?
// Klassen dienen als Vorlage für viele
einzelne Exemplare (Objekte).
// Objekte sind Referenzdatentypen.
Nozar Delassaei Marvi / HAW Hamburg
4
Beispiel „Klasse“
public class Auto {
public String name;
private int PS;
public int getPS()
{
return PS;
}
}
Nozar Delassaei Marvi / HAW Hamburg
5
Abstrakte Klasse
// Was ist ein abstrakte Klasse?
// Eine abstrakte Klasse ist in Java eine
Klassendefinition, die ausschließlich der
Vererbung ihres Inhaltes dient.
//Eine abstrakte Klasse kann keine privaten
Methoden haben.
// Ein abstrakte Klasse kann als Basisklasse
verwendet werden.
Nozar Delassaei Marvi / HAW Hamburg
6
Syntax
// Allgemeiner Aufbau lautet:
abstract class Klassenname {
public abstract void abstrakteMethode()
{
}
public void konkrete Methode()
{
}
...
}
Nozar Delassaei Marvi / HAW Hamburg
7
Mehrfachvererbung-1
Ein Objekt kann die Eigenschaften aus
mehreren Klassen beziehen, ein Objekt
kann mehrere Schnittstellen besitzen.
Autos und
Schiffe sind Unterklassen von Fahrzeugen,
Amphibienfahrzeug ist sowohl Auto als
auch Schiff.
Æ Mehrfachvererbung
Nozar Delassaei Marvi / HAW Hamburg
8
Mehrfachvererbung-2
// Mit Mehrfachvererbung kann eine Klasse ohne
großen Aufwand aus bestehenden Klassen
zusammengesetzt werden.
// Die beerbende Klasse enthält alle Datenfelder
und alle Methoden aus allen beerbten Klassen.
Nozar Delassaei Marvi / HAW Hamburg
9
Es gibt ein Problem!
keine Mehrfachvererbung von Klassen
in Java!!!
// Eine grundsätzlich Designentscheidung der Java-Erfinder
war, keine Mehrfachvererbung zu unterstützen.
Æ Die Gründe:
a) möglichen Schwierigkeiten beim Umgang mit
mehrfacher Vererbung
b) Das Erben nichttrivialer Methoden aus mehr als einer
Klasse in der Praxis ist selten zu realisieren.
Æ Die Lösung .....
Nozar Delassaei Marvi / HAW Hamburg
10
Interfaces
(Schnittstelle)
Æ Mit der Hilfe von Interfaces bietet Java eine Konstruktion an, solche
Anforderungen zu lösen.
Nozar Delassaei Marvi / HAW Hamburg
11
Definition
// Ein Interface ist eine besondere Form einer
Klasse, die ausschließlich abstrakte Methoden
und Konstanten enthält.
// Anstelle des Schlüsselwortes class wird ein
Interface mit dem Schlüsselwort interface
deklariert.
// Eine Interface-Variable ist kompatibel zu allen
Objekten, deren Klassen dieses Interface
implementieren.
Nozar Delassaei Marvi / HAW Hamburg
12
Syntax
// Syntax
[Modifikator] interface Interface
{
[final] [Modifikator] Typ Variable = Wert; [abstract]
[Modifikator] Typ Methode();
}
//Quellcode:
interface MyInterface
{
public int i = 0; public void print();
}
Nozar Delassaei Marvi / HAW Hamburg
13
// Durch die Definition wird die Schnittstelle
(interface) nur beschrieben, die
gewünschte Funktionalität wird noch nicht
zur Verfügung gestellt.
// Das folgende Listing definiert ein Interface
„Groesse“, das die drei Methoden laenge,
hoehe und breite enthält.
Nozar Delassaei Marvi / HAW Hamburg
14
Implementierung eines Interface
// Soll die gewünschte Funktionalität von Klassen realisiert werden,
muss diese zuerst implementiert werden. Die neue gewünschte
Funktionalität erweitert die „class-Anweisung“ um eine „implementsKlausel“. Hinter der Klausel wird der Name der zu
implementierenden Interface angegeben. Jetzt ist die Aufgabe der
Compiler, um alle im Interface geforderten Methoden
definitionsgemäß zu implementieren. (Beispiele: Auto2 und
Fußballplatz )
// Die Art der Realisierung der vereinbarten Methoden spielt für das
Implementieren eines Interface keine Rolle. Tatsächlich kommt es
ausgesprochen häufig vor, dass Interfaces von sehr
unterschiedlichen Klassen implementiert und die erforderlichen
Methoden auf sehr unterschiedliche Weise realisiert werden.
Nozar Delassaei Marvi / HAW Hamburg
15
Verwenden eines Interface
// Ein einfaches Beispiel für die Anwendung des Interfaces:
Dazu soll eine Methode „grundflaeche“ entwickelt werden, die zu
jedem Objekt, das das Interface „Groesse“ implementiert, dessen
Grundfläche (Länge mal Breite) berechnet. (Beispiel 0905)
Nozar Delassaei Marvi / HAW Hamburg
16
Das Interface Comparable
Dieses Interface kann von Klassen implementiert werden,
deren Objekte paarweise vergleichbar sind. Die Methode
compareTo liefert genau dann einen Wert kleiner 0,
wenn das Objekt »kleiner«; größer 0, wenn es »größer«,
und gleich 0, wenn es »gleich« dem als Argument
übergebenen Objekt o ist. (Beispiel Listing 0907)
Mit Hilfe von Comparable kann die Reihenfolge der Objekte
einer Klasse ermittelt werden. Aus dem Paarweisen
Vergleich lässt sich eine implizite Ordnung der Elemente
ableiten, denn für alle aufeinander folgenden Objekte a
und b muss a.compareTo(b) <= 0 gelten.
Nozar Delassaei Marvi / HAW Hamburg
17
Mehrfachimplementierung und Vererbung
1. Mehrfachimplementierung
// Es ist durchaus möglich, dass eine Klasse mehrere Interfaces
implementiert.
Sie muss dann zu jedem Interface alle darin definierten Methoden
implementieren.
// Mit jedem implementierten Interface wird sie zu dem dadurch definierten
Datentyp kompatibel.
Eine Klasse, die n Interfaces implementiert, ist demnach zu n + 1
Datentypen (plus ihren jeweiligen Oberklassen) kompatibel. (Beispiel Auto3)
Nozar Delassaei Marvi / HAW Hamburg
18
Mehrfachimplementierung und Vererbung
2. Vererbung von Interfaces
// Wenn eine Klasse die Interfaces seiner Basisklasse erbt:
Auto4 erbt von Auto2 nicht nur die Implementierung,
sondern auch die Klausel „implements Groesse“ und
erweitert sie um die Implementierung von Comparable.
Æ Damit ist Auto4 gleichwertig zu Auto3
Nozar Delassaei Marvi / HAW Hamburg
19
Mehrfachimplementierung und Vererbung
3. Ableiten von Interfaces
// Auch Interfaces selbst können abgeleitet werden. Ähnlich einer Klasse
erbt das abgeleitete Interface alle Methodendefinitionen des
BasisInterfaces.
// Die implementierende Klasse muss also auch alle Methoden von allen
übergeordneten Interfaces implementieren.
Nozar Delassaei Marvi / HAW Hamburg
20
Weitere Anwendungen von Interfaces
1.Konstanten in Interfaces
// Interfaces können auch Konstanten, also Membervariablen mit den Attributen
static und final, enthalten.
Wenn eine Klasse ein Interface implementiert, erbt es auch alle seine
Konstanten.
ÆEs ist auch erlaubt, dass ein Interface ausschließlich Konstanten enthält.
// Dieses Feature kann zum Beispiel nützlich sein, wenn ein Programm sehr
viele Konstanten definiert. Anstatt sie in ihren eigenen Klassen zu belassen
und bei jedem Gebrauch durch den qualifizierten Ausdruck Klasse.Name
aufzurufen, könnte ein Interface definiert werden, das alle
Konstantendefinitionen vereinigt. Wenn nun jede Klasse, in der diese
Konstanten benötigt werden, dieses Interface implementiert, stehen alle
darin definierten Konstanten direkt zur Verfügung und können ohne
qualifizierten Klassennamen aufgerufen werden.
Nozar Delassaei Marvi / HAW Hamburg
21
Weitere Anwendungen von Interfaces
1.1 static import
Seit der J2SE 5.0 gibt es eine Möglichkeit,
statische Teile aus Klassen und Interfaces
unqualifiziert zu benutzen, ohne
implements zu verwenden.
Nozar Delassaei Marvi / HAW Hamburg
22
Weitere Anwendungen von Interfaces
2. Implementierung von Flags
//Einige Interfaces definieren weder Methoden noch Konstanten. Sie stellen
statt dessen eine Art Flag, also einen logischen Schalter dar, der zur Compileund Laufzeit abgefragt werden kann.
Æ Beispiel: Interface Cloneable
//Cloneable ist ein Schalter für die in der Klasse Object implementierte Methode
clone.
ÆImplementiert eine abgeleitete Klasse dieses Interface nicht, so deutet clone
das als fehlende Fähigkeit (oder Bereitschaft) der Klasse, eine Objektkopie
herzustellen, und löst beim Aufruf eine CloneNotSupportedException aus.
Æ Implementiert die abgeleitete Klasse dagegen Cloneable, erzeugt ein Aufruf
von clone eine elementweise Kopie des aktuellen Objekts.
Nozar Delassaei Marvi / HAW Hamburg
23
Weitere Anwendungen von Interfaces
3. Nachbildung von Funktionszeigern
// Eine wichtige Anwendung von Interfaces besteht darin, eine Funktion als
Argument an andere Funktionen zu übergeben.
Æ Beispiele für ihre Anwendung sind Funktionsplotter oder CallbackFunktionen bei der Programmierung grafischer Oberflächen.
// Funktionszeiger können leicht mit Hilfe von Interfaces nachgebildet werden.
Dazu wird zunächst ein Interface definiert, das eine einzelne Methode f des
gewünschten Typs deklariert. Es kann dann von unterschiedlichen Klassen so
implementiert werden, dass in f jeweils die gewünschte Berechnung
ausgeführt wird. Anstelle der Übergabe eines Zeigers wird nun einfach ein
Objekt dieser Klasse instanziert und an die zu konfigurierende Methode
übergeben. Diese wird vom Typ des Interfaces deklariert und kann so die
Methode f aufrufen. (Beispiel 0915)
Nozar Delassaei Marvi / HAW Hamburg
24
Interfaces und Hilfsklassen
1. Die Default-Implementierung
// Es gibt viele Gemeinsamkeiten zwischen (abstrakten) Klassen und Interfaces.
ÆFür die Verwendung des Interfaces spricht die größere Flexibilität durch die
Möglichkeit, in unterschiedlichen Klassenhierarchien verwendet zu werden.
ÆFür die Verwendung einer Klasse spricht die Möglichkeit, bereits ausformulierbare
Teile der Implementation zu realisieren und die Fähigkeit, statische Bestandteile und
Konstruktoren unterzubringen.
// Wird ein Interface erstellt, das voraussichtlich häufig implementiert werden muss
und/oder viele Methoden definiert, ist es sinnvoll, eine Default-Implementierung zur
Verfügung zu stellen.
// Damit ist eine Basisklasse gemeint, die das Interface und alle sinnvoll realisierbaren
Methoden implementiert. Besitzt eine Klasse, die das Interface implementieren muss,
keine andere Vaterklasse, so kann sie von der Default-Implementierung abgeleitet
werden und erbt so bereits einen Teil der sonst manuell zu implementierenden
Funktionalität.
Nozar Delassaei Marvi / HAW Hamburg
25
Interfaces und Hilfsklassen
2. Delegation an die Default-Implementierung
// Läßt sich eine potentielle SimpleTreeNode-Klasse nicht von
DefaultTreeNode ableiten, muss sie das Interface selbst
implementieren. Besitzt die Default-Implementierung bereits
nennenswerte Funktionalitäten, wäre es schlechter Stil, diese ein
zweites Mal zu implementieren. Statt dessen ist es eventuell
möglich, die Implementierung an die bereits vorhandene
DefaultTreeNode zu delegieren.
// Dazu muss die zu implementierende Klasse eine Membervariable
vom Typ DefaultTreeNode anlegen und alle Aufrufe der InterfaceMethoden an dieses Objekt weiterleiten.
Nozar Delassaei Marvi / HAW Hamburg
26
Vielen Dank für Ihre Aufmerksamkeit!
Nozar Delassaei Marvi / HAW Hamburg
27
Herunterladen