Schnittstelle (Objektorientierung)
Eine Schnittstelle (englisch interface) gibt in der objektorientierten Programmierung an, welche Methoden in den unterschiedlichen Klassen vorhanden sind oder vorhanden sein müssen.
Technische Details
Eine Schnittstelle gibt an, welche Methoden vorhanden sind oder vorhanden sein müssen. Zusätzlich zu dieser syntaktischen Definition sollte ein so genannter Kontrakt über die Bedeutung (Semantik) definiert werden, festgelegt als Vorbedingungen und Nachbedingungen der verschiedenen Methoden. Der Kontrakt wird meist nur informell in der Dokumentation oder einer externen Spezifikation der Schnittstelle festgelegt. Es stehen auch formelle Spezifikationssprachen wie z. B. die OCL zur Verfügung. Einige Programmiersprachen wie z. B. Eiffel bieten auch unmittelbar syntaktische Möglichkeiten zur Festlegung eines Kontrakts.
Schnittstellen stellen eine Garantie über die in einer Klasse vorhandenen Methoden dar. Sie geben an, dass alle Objekte, die diese Schnittstelle besitzen, gleich behandelt werden können.
In einigen Programmiersprachen, die keine Mehrfachvererbung unterstützen (wie z. B. Java), können Schnittstellen verwendet werden, um Kompatibilitäten zwischen Klassen zu definieren, die nicht voneinander erben: Die Schnittstellenbeziehungen sind nicht an den strengen Klassenbaum gebunden. Dazu werden Schnittstellendeklarationen häufig explizit als solche markiert (etwa mit dem Schlüsselwort interface
). Als Ersatz für Mehrfachvererbung eignen sich Schnittstellen allerdings nur eingeschränkt, da sie lediglich Methoden und deren Parameter definieren und keine direkte Vererbung von Funktionalität ermöglichen.
In Java gibt es mittlerweile die Möglichkeit, in Schnittstellen Methoden tatsächlich zu implementieren und als Standard (default
) zu markieren. Dies ermöglicht die Definition von Funktionalität, die Klassen „erben“, die das Interface nutzen. Java-Interfaces entwickeln sich dadurch etwas näher in Richtung der Mehrfachvererbung.
Deklaration
Andere Sprachen (meist solche, die Mehrfachvererbung unterstützen, wie C++) kennen zwar das Konzept von Schnittstellen, behandeln diese aber wie gewöhnliche Klassen. Man spricht dann auch von abstrakten Klassen. Manchmal wird auch eine eigene Sprache (eine sogenannte Schnittstellenbeschreibungssprache, IDL) zur Deklaration der Schnittstelle verwendet – meist ist das bei Middleware-Systemen wie CORBA oder DCOM der Fall. Objektbasierte Sprachen ohne strenge Typisierung kennen meist keine Schnittstellen.
Beispiel für eine Schnittstelle
Existiert beispielsweise eine Schnittstelle Konto
mit der Methode abbuchen()
, müssen alle Klassen, die diese Schnittstelle implementieren, über eine Methode abbuchen
verfügen. Weiteres Beispiel: Eine Anzahl an Klassen mit den Namen SparKonto
, GiroKonto
und DepotKonto
implementieren die Schnittstelle Konto
. Die Schnittstelle hat eine Methode getKontostand
, also müssen alle Klassen mit der Schnittstelle die Methode getKontostand
bereitstellen.
Werden in einer Klasse mehrere Schnittstellen implementiert und besitzen deren Methoden gleiche Namen und gleiche Signatur (Parametertyp und Rückgabetyp), so muss der Zugriff und die Implementierung in einer Klasse mit einem qualifizierten Namen erfolgen, d. h. durch Voranstellen das Paketnamens (Java) oder des Namensraumes (.NET). Ein Beispiel in Java:
public interface Konto {
int getKontostand(); // abstrakte Signatur-Definition
}
public class SparKonto implements Konto {
private int kontostand;
// Implementierung der durch Konto definierten Methode
public int getKontostand() {
return kontostand;
}
…
}
Java unterscheidet sich in einem weiteren Punkt gegenüber .NET-Sprachen darin, dass eine Klasse, die ein Interface implementiert, nicht explizit deklariert werden muss. Das folgende Beispiel definiert eine sogenannte anonyme innere Klasse innerhalb einer Methode.
public Konto erstelleKonto()
{
return new Konto() { //Beginn der anonymen inneren Klasse
// Implementierung der durch Konto definierten Methode
public int getKontostand() {
return 0;
}
}; //Ende der anonymen inneren Klasse
}
Namenskonventionen
In einigen Programmiersprachen ist es üblich, Schnittstellen durch besondere Präfixe oder Suffixe erkennbar zu machen (Ungarische Notation). So wird häufig ein „I“ (für Interface) vorangestellt oder ein „IF“ beziehungsweise „Interface“ angehängt. Die oben angeführte Beispielschnittstelle Konto
hieße dann IKonto
, KontoInterface
oder KontoIF
.
- Vorteile
- Schnittstellen sind am Namen als solche erkennbar.
- Implementierende Klassen können einen einfacheren Namen haben.
- Nachteile
- Schnittstellen sollten nicht am Namen als solche erkannt werden, da man als Verwender anderer Objekte immer nur deren Schnittstelle (also öffentliche Methoden) bedenken sollte.[1]
- Schnittstellen können als das wesentliche Element der Programmierung betrachtet werden. Daher ist es sinnvoller, die Namen der Implementierungen mit Präfixen oder Suffixen zu ergänzen.
- Schnittstellen sind besonders dann sinnvoll, wenn es mehr als eine Implementierung gibt, sodass die implementierenden Klassen ohnehin mit Präfixen und Suffixen benannt werden.
Siehe auch
Einzelnachweise
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns. Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995, ISBN 0-201-63361-2, Seite 18