Kapitel 5: Interfaces

Werbung
Liste P: Programmieren mit Java
WS 2001/2002
Prof. Dr. V. Turau
FH Wiesbaden
Kapitel 5: Interfaces
Folie 82 : Einleitung
Betrachtet man die Programmierleistung für ein Produkt über einen längeren Zeitraum, so
stellt man fest, das die eigentliche Entwicklungszeit meist unter 20% liegt.
Der größte Zeitanteil entfällt auf Wartungs- und Änderungsarbeiten
Dies sollte bei der Softwareentwicklung berücksichtigt werden:
Coderedundanz vermeiden
Erweiterungsmöglichkeiten einplanen
Dokumentation
....
Folie 83 : Interfaces
Bei der Zerlegung eines Problems in Teilprobleme und deren Lösung durch einzelne Klasse
sind zunächst nur die öffentlichen Methoden interessant, welche eine Klasse anbieten muss
Die Implementierung der Klasse muss diese Methoden dann zur Verfügung stellen
Damit zu einem späteren Zeitpunkt eine Klasse durch eine andere ersetzt werden kann, muss
diese die gleichen Methoden anbieten
Eine Realisierungsmöglichkeit sind Unterklassen, d.h. die neue Klasse ist eine Unterklasse
der alten Klasse
Folie 84 : Interfaces
Dies kann jedoch zu ungewollten Abhängigkeiten und Einschränkungen führen
Java bietet die Möglichkeit eine Schnittstelle zu vereinbaren, dies geschieht mit Interfaces
Ein Interface vereinbart eine Reihe von abstrakten Methoden
Die Angabe eine Implementierung ist nicht möglich
Interfaces führen wie Klassen neue Referenztypen ein, d.h. der Typ einer Variable kann ein
Interface sein
Solchen Variablen dürfen nur Objekte zugewiesen werden, deren Klassen das vereinbarte
Interface implementieren
Folie 85 : Vereinbarung von Interfaces
Innerhalb eines Paketes bilden die Namen von Klassen und Interfaces einen Namensraum,
d.h. die Namen müssen alle verschieden sein
Vereinbarung:
[public] [abstract] interface Name { ... }
Der Modifier abstract ist zwar erlaubt, hat aber keine weitere Bedeutung
Der Modifier public hat die gleiche Bedeutung wie bei Klassen
Vereinbarungen von Interfaces werden wie Klassenvereinbarungen in separaten Dateien mit
der Endung java abgespeichert
Folie 86 : Implementierung eines Interfaces
Eine Klasse kann mehrere Interfaces implementieren, dazu muss sie
Die Interfaces bei der Klasenvereinbarung angeben
class Name implements Interface1, Interface2 ..
Eine Implementierung für alle Methoden der angegebenen Interfaces bereitstellen
Bei der Vereinbarung zunächst die Oberklasse und dann die implementierten Interfaces
angeben
Der Compiler prüft, ob eine Klasse die angegebenen Interfaces implementiert
Folie 87 : Interfaces (Beispiel)
Um Objekte zu sortieren, muss eine Vergleichsrelation definiert sein
Beispiele:
Strings (alphabetisch)
Zahlen (die Größe)
Rechteck (die Fläache)
Das Interface Comparable vereinbart eine Methode zum Vergleichen von Objekten:
public interface Comparable {
public abstract int compareTo(Object o);
}
Folie 88 : Interfaces (Beispiel)
Der Rückgabewert von compareTo ist
negativ, wenn das Empfängerobjekt kleiner ist
0, wenn beide Objekte gleich sind
positiv, wenn das Empfängerobjekt größer ist
Zahlreiche Klassen implementieren dieses Interface
String
Date
Time
Folie 89 : Interfaces (Beispiel)
import java.awt.Point;
public class Punkt extends Point implements Comparable {
public Punkt(int x, int y) {
super(x,y);
}
/* Ein Punkt ist kleiner als ein anderer Punkt,
wenn er links von ihm liegt */
public int compareTo(Object o) {
if (this.x == ((Point)o).x)
return 0;
return (this.x < ((Point)o).x) ? -1 : 1;
}
}
Folie 90 : Interfaces (Beispiel)
Problem: Wird der Methode keine Instanz von Punkt übergeben, so kommt es zu einer
ClassCastException
Lösung:
public int compareTo(Object o) {
if (o instanceof Punkt) {
if (x == ((Point)o).x)
return 0;
return (x < ((Point)o).x) ? -1 : 1;
}
return -1;
}
Folie 91 : Interfaces (Anwendung)
Eine Klasse zum Sortieren von Objekten, welche das Interface Comparable implementieren
Die Klasse soll ein Feld mit Objekten, welche das Interface Comparable implementieren,
aufsteigend sortieren
Vorteil:
Die Sortierklasse kann zum Sortieren beliebiger Objekte verwendet werden
Lösung in C:
qsort(void *base, size_t n size_t size,
int (*cmp)(const void *, const void *));
Lösung in C++: Templates
Folie 92 : Shellsort
public class ShellSort {
public static void sort(Comparable[] o) {
for (int incr = o.length/2; incr > 0; incr /=2)
for (int i = incr; i < o.length; i++)
for (int j = i - incr; (j >= 0) &&
(o[j].compareTo(o[j+incr]) > 0); j -= incr) {
Comparable tmp = o[j];
o[j] = o[j+incr];
o[j+incr] = tmp;
}
}
}
Folie 93 : Anwendung
public class TestSort {
public static final int ANZAHL = 10, MAX = 30;
public static void main(String[] a) {
Punkt[] punkte = new Punkt[ANZAHL];
Random zufall = new Random();
for (int i = 0; i < punkte.length; i++) {
punkte[i] = new Punkt(zufall.nextInt()%MAX,
zufall.nextInt()%MAX);
System.out.print(punkte[i] + " " );
}
System.out.println();
ShellSort.sort(punkte);
for (int i = 0; i < punkte.length; i++)
System.out.print(punkte[i] + " " );
}
}
Folie 94 : Interfaces (Beispiel)
import java.util.*;
public class CompareVector extends Vector
implements Comparable {
/* Ein Vector ist kleiner als ein anderer Vector,
wenn er weniger Element hat */
public int compareTo(Object o) {
if (o instanceof Vector)
return x.size() - ((Point)o).size();
else
return -1;
}
}
Folie 95 : Eigene Interfaces
Der Quellcode eines Interfaces wird wie der einer Klasse in einer eigenen Datei abgespeichert
Interface-Name gleich Dateiname + Endung java
Interfaces werden wie Klasse übersetzt
Der übersetzte Code wird in einer Datei mit der Endung class abgelegt
Alle Members eines Interfaces sind implizit public und abstract (d.h. diese Modifier
müssen nicht angegeben werden)
Eine Klasse kann mehrere Interfaces implementieren
Folie 96 : Statische Konstanten
Interfaces können neben Methoden auch statische Konstanten vereinbaren
Beispiel Interface SocketOptions
public interface SocketOptions {
public static final int SO_TIMEOUT = 4102;
public static final int SO_BINDADDR = 15;
....
}
Verwendung:
System.out.println(SocketOptions.SO_TIMEOUT);
Variablen in Interfaces sind implizit public, static und final (d.h. diese Modifier müssen
nicht angegeben werden)
Folie 97 : Das Interfaces Enumeration
Das Interface java.util.Enumeration vereinbart einen Iterator
Methoden:
public boolean hasMoreElements();
public Object nextElement();
Verwendung:
Enumeration e = ...;
while (e.hasMoreElements()) {
Object o = e.nextElement();
...
}
Achtung: Rückgabetyp von nextElement() ist Object, in der Regel ist ein Typ-Cast
notwendig
Folie 98 : Das Interfaces Enumeration
Beispiele:
public Enumeration elements();
Klasse Vector
public Enumeration keys();
Klasse Hashtable
public Enumeration propertyNames(); Klasse Properties
Anwendung in der Klasse Element in Kapitel 4:
protected void printAttribute(PrintWriter w) {
Enumeration enum = attribute.propertyNames();
while (enum.hasMoreElements()) {
String name = (String) enum.nextElement();
w.print(’ ’ + name + "=’" +
attribute.getProperty(name) + "’");
}
}
Folie 99 : Erweiterung von Interfaces
Interfaces können andere Interfaces erweitern
Vereinbarung:
interface Name [extends Interface1 [, Interface2, ..]]
Bedeutung: wie bei Klassen, alle Methoden werden geerbt.
Beispiel:
public interface Ordnung extends Comparable {
public boolean equals(Object o);
}
Herunterladen