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.