„Hallo Amigo! Heute möchte ich dir erklären, warum es Interfaces gibt. Man hört immer wieder, dass eine bestimmte Klasse, ein Objekt oder eine Entität ein bestimmtes Interface (eine Schnittstelle) unterstützt. Was bedeutet es, ein Interface zu unterstützen?“

Interfaces unterstützen ein bestimmtes Verhalten - 1

In einem weiter gefassten Sinn ist ein Interface ein Mechanismus, über den irgendein Ding mit irgendetwas anderem interagiert. Zum Beispiel ist eine TV-Fernbedienung ein Interface zum Fernbedienen. Ein Hund versteht Kommandos und führt sie aus, d.h. der Hund unterstützt ein Interface für die „Sprachsteuerung“. Zusammenfassend können wir sagen, dass ein Interface eine standardisierte Art und Weise ist, wie zwei Dinge interagieren, bei der beide Parteien den Standard kennen. Wenn eine Person einem Hund sagt, er solle „Sitz machen“, dann ist dieses Kommando Teil der „Hunde-Sprachsteuerung“, und wenn der Hund dem Kommando gehorcht, dann sagen wir, dass der Hund das Interface unterstützt.

So ist es auch in der Programmierung. Methoden sind Aktionen, die an einem Objekt, an seinen Daten, durchgeführt werden. Und wenn eine Klasse bestimmte Methoden implementiert, dann „unterstützt sie die Ausführung“ bestimmter Befehle. Welche Vorteile erhalten wir durch die Kombination von Methoden zu einem Interface?

1) Jedes Interface hat, genau wie eine Klasse, einen eindeutigen Namen. Jede Partei kann absolut sicher sein, dass die andere Partei genau das ihr bekannte Interface unterstützt und nicht irgendein ähnliches Interface.

2) Jedes Interface schränkt eine Klasse, die dieses Interface unterstützt, in gewissen Punkten ein. Die Klasse (ihr Entwickler) entscheidet, was sie beim Aufruf der von einem Interface geerbten Methoden tut, aber das Ergebnis muss sich im Rahmen der sinnvollen Erwartungen bewegen. Wenn wir einem Hund befehlen, „Sitz zu machen“ und er sich dann 5 Minuten lang auf seinem Platz rollt und dann setzt, dann unterstützt er das Interface. Aber wenn er dich stattdessen am Bein packt, dann können wir wohl kaum behaupten, dass er das Interface unterstützt. Die Ausführung des Befehls hat nicht das erwartete Ergebnis gebracht.

Nehmen wir an, du und deine Freunde schreiben ein Computerspiel. Du wurdest beauftragt, das Verhalten eines Charakters zu programmieren. Einer deiner Kollegen hat bereits einen Code geschrieben, um alle Charaktere auf dem Bildschirm anzuzeigen. Ein zweiter Kollege, der für das Speichern des Spiels auf der Festplatte verantwortlich ist, hat Code geschrieben, der alle Spielobjekte in einer Datei speichert. Jeder hat eine Menge Code geschrieben und ein Interface für die Interaktion mit diesem Code erstellt. Das könnte zum Beispiel so aussehen:

Java-Code Beschreibung
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
– Interface zum Speichern / Laden eines Objektes von einer Karte.
interface Drawable
{
 void draw(Screen screen);
}
– Interface zum Darstellen eines Objektes innerhalb des übergebenen Screen-Objektes.
class PacMan implements Saveable, Drawable
{}
– Deine Klasse, die zwei Interfaces unterstützt.

Mit anderen Worten, um ein beliebiges Interface (Gruppe von Interfaces) zu unterstützen, muss deine Klasse:

1) Sie erben

2) Die in ihnen deklarierten Methoden implementieren

3) Die Methoden müssen das tun, wofür sie konzipiert wurden.

Dann kann der Rest des Programmcodes, der nichts über deine Klasse und ihre Objekte weiß, mit deiner Klasse arbeiten.

„Warum darf der Code nichts über meine Klasse wissen?“

„Nehmen wir an, du hast den Code von einem Programm genommen, das jemand vor einem Jahr geschrieben hat. Oder nehmen wir an, deine Freunde haben die Spiel-Engine von jemand anderem gekauft/lizenziert. Du hast also einen funktionierenden Code für das Spiel. Tausende von Objekten, die miteinander interagieren. Und sie können problemlos korrekt mit deinen Objekten interagieren, wenn du diese Interaktion durch Interfaces ermöglichst, die deine Klassen korrekt implementiert haben.“

„Wahnsinn! Ich wusste nicht, dass das möglich ist.“

„Alle großen Projekte funktionieren so. Schon lange programmiert niemand mehr alles von Grund auf neu.“

Man erfindet ja auch nicht jedes Mal die Mathematik oder das Alphabet neu. Stattdessen lernt man alles, was bisher erfunden wurde.