OOP Teil5 Interfaces

Werbung
Berufs-
Akademie Berlin
Fachbereich der FHW Berlin
Einführung in die
objektorientierte Programmierung
Teil 5 – Interface-Klassen
Modul WI111: Objektorientierte Programmierung
Fachrichtung Wirtschaftsinformatik
Prof. Dr. Gert Faustmann
Fachbereich Berufsakademie der FHW Berlin
Berufs-
Akademie Berlin
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Fachbereich der FHW Berlin
Grundlagen
Interfaces (oder Schnittstellen) beschreiben, was Klassen tun sollen, ohne
zu spezifizieren, wie sie es tun sollen. Somit stellt eine Schnittstelle im
eigentlichen Sinne keine Klasse dar, sondern eine Menge von
Anforderungen.
Ein Anbieter garantiert für Klassen eine Dienstleistung, wenn diese
Klassen eine bestimmte Schnittstelle implementieren.
Beispiel: Interface Comparable public interface Comparable{
int compareTo(Object other);
}
Jede Klasse, die diese Schnittstelle implementiert, kann z.B. in einem
Array sortiert werden.
Eine Klasse kann eine oder mehrere Schnittstellen implementieren. So
wird in Java die Mehrfachvererbung realisiert.
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Definition von Interfaces
Ein Interface wird anstatt mit class mit dem Schlüsselwort interface
definiert.
Die Definition darf nur Methoden und Konstanten enthalten.
Beispiel:
public interface Groesse{
public int laenge();
public int hoehe();
public int breite();
}
Die Definition ist ähnlich einer abstrakten Klasse. Das Beispiel beschreibt
eine Schnittstelle für den Zugriff auf die räumliche Ausdehnung von
Objekten.
Von einem Interface können keine Objekte erzeugt werden! Jedoch
können Referenzvariablen angelegt werden.
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Implementierung von Interfaces
Die Funktionalität einer Schnittstelle muss in einer Klasse implementiert
werden.
class Kfz implements Groesse{
private long
nr;
private String hersteller;
private int laenge;
private int hoehe;
private int breite;
public int laenge(){
return this.laenge;
}
public int hoehe(){
return this.hoehe;
}
public int breite(){
return this.breite;
}
}
Die Art der Realisierung spielt für die Implementierung einer Schnittstelle
keine Rolle.
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Verwenden von Interfaces
Es kann z.B. eine Methode grundflaeche definiert werden, die für
Objekte, die das Interface Groesse implementieren, die Grundfläche
berechnet:
public static long grundflaeche(Groesse g){
return (long)g.laenge() * g.breite();
}
Jetzt können beliebige Objekte erzeugt werden, deren Klassen das
Interface Groesse implementieren und es kann deren Grundfläche
berechnet werden.
Hier wird deutlich, dass Schnittstellen nicht wie abstrakte Klassen in einer
Vererbungslinie stehen und dadurch für bestimmte Eigenschaften besser
einsetzbar sind.
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Beispiel: Das Interface Comparable
Die Methode compareTo(Object o) der Schnittstelle Comparable liefert
einen negativen Wert, falls das Objekt kleiner, 0, falls das Objekt gleich und
einen positiven Wert, falls das Objekt größer als das als Argument
übergebene Objekt o ist.
public int compareTo(Object otherObject){
Kfz other = (Kfz)otherObject;
if (hoehe*breite*laenge < other.hoehe*other.breite*other.laenge){
return -1;
}
if (hoehe*breite*laenge > other.hoehe*other.breite*other.laenge){
return 1;
}
return 0;
}
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Mehrfachimplementierung
Eine Klasse kann auch mehrere Interfaces implementieren. Sie muss dann
alle Methoden der Interfaces realisieren.
class Kfz implements Groesse, Comparable{
private long
nr;
private String hersteller;
private int laenge;
private int hoehe;
private int breite;
public int laenge(){...}
public int hoehe(){...}
public int breite(){...}
public int compareTo(Object o){...}
}
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Vererbung und Ableitung von Interfaces
• Schnittstellen werden auch bei der Vererbung von Klassen mitvererbt:
class A implements Groesse{
...
}
class B extends A{
...
}
Die Klasse B beinhaltet somit auch die Implementierung der Schnittstelle
Groesse.
• Auch Schnittstellen können in einer Vererbungshierarchie stehen:
interface einDimensional{
public int laenge();
}
interface zweiDimensional
extends einDimensional{
public int breite();
}
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Übung
Aufgabe 1: Vorhandene Schnittstelle implementieren
Erweitern Sie die von Ihnen erstellte Datumsklasse um die Schnittstelle
Comparable. Realisieren Sie dazu entsprechend die compareTo()
Methode.
Testen Sie Ihre Erweiterung, indem Sie zum einen verschiedene
Datumswerte direkt miteinander vergleichen und indem sie zum anderen
ein Array von Datumswerten aufbauen und die Methode Arrays.sort()
aufrufen.
Aufgabe 2: Eigene Schnittstelle definieren und nutzen
Implementieren Sie für Ihre Kontenklassen das Interface Zinsen mit den
Methoden double zinssatz() und double berechnung().
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Anwendung: Konstanten
Interfaces können auch Konstanten (Attribute, die static und final
sind) enthalten. Klassen, die ein Interface implementieren, erben auch alle
Konstanten. Interfaces können auch nur Konstanten enthalten.
Beispiel 1:
Die Standardbibliothek enthält die Schnittstelle SwingConstants. Sie
enthät u.a. die Konstanten NORTH, SOUTH und HORIZONTAL. Klassen, die
diese Schnittstelle implementieren können direkt auf diese Konstanten
zugreifen.
Beispiel 2:
interface Groesse{
...
public static final double METER_IN_MILE 1609.3;
}
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Anwendung: Flags
Interfaces können auch als Flags (Schalter) verwendet werden. Sie
definieren dann weder Methoden noch Konstanten.
Beispiele sind die Interfaces java.io.Serializable und
java.lang.Cloneable.
Implementiert eine Klasse nicht die Schnittstelle Cloneable, so wird dies
als fehlende Fähigkeit oder Bereitschaft gedeutet, eine Kopie ihrer
Objekte herzustellen.
Für tiefe Kopien (inklusive aller Objektreferenzen) ist die Methode
clone() der Klasse Object klassenspezifisch zu überlagern1. Soll jeder
Kopien anfertigen können, so muss die Überlagerung als public deklariert
werden.
1clone()
ist also nicht in der Schnittstelle Cloneable definiert!
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Anwendung: Funktionszeiger
In Java gibt es keine Möglichkeit, einer Funktion als Argument andere
Funktionen zu übergeben.
Funktionszeiger können jedoch mit Interfaces nachgebildet werden. Ein
solches Interface deklariert eine Funktion des gewünschten Typs.
Unterschiedliche Klassen implementieren dann diese Methode auf
unterschiedliche Arten.
Beispiel:
public interface DoubleMethod{
public double compute(double value);
}
Es werden Objekte dieser Klassen instanziiert und an eine verarbeitende
Methode übergeben werden. Diese erwartet ein Objekt vom Typ
DoubleMethod.
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Funktionszeiger (II)
Akademie Berlin
Fachbereich der FHW Berlin
Verarbeitende Methode
erwartet Objekte vom Typ
des Interfaces
public class FktZeiger {
public static void printResult(DoubleMethod meth, double wert){
System.out.println("Ergebnis: "+meth.compute(wert));
}
public static void main(String[] args) {
Objekte werden instanziiert
printResult(new Quadr(), 4);
und an verarbeitende
printResult(new Sqr(), 4);
Methode übergeben
} }
interface DoubleMethod{
double compute(double wert);
Interface deklariert
Methode
}
class Quadr implements DoubleMethod{
public double compute(double wert){
return wert*wert;
} }
Klassen implementieren
class Sqr implements DoubleMethod{
Methode
public double compute(double wert){
return Math.sqrt(wert);
} }
Berufs-
Prof. Dr. Gert Faustmann
Einführung in die OOP
Teil 5 – Interface-Klassen
Akademie Berlin
Fachbereich der FHW Berlin
Übung
Erweitern Sie Ihre Konto-Basisklasse um das Datum der Kontoanlage.
Benutzen Sie dafür die von Ihnen selbst erstellte Klasse Datum!
Implementieren Sie dann für Ihre Kontenklassen die Möglichkeit, Konten
zu kopieren. Nutzen Sie dazu das Interface Cloneable. Beachten Sie,
dass eine tiefe Kopie des Kontos anzufertigen ist.
Herunterladen