Schnittstelle (objektorientierte Programmierung)
aus Wikipedia, der freien Enzyklopädie
In der objektorientierten Programmierung (OOP) vereinbaren Schnittstellen (engl. Interface) gemeinsame Signaturen von Klassen. Das heißt, eine Schnittstelle vereinbart die Signatur einer Klasse, die diese Schnittstelle implementiert. Das Implementieren einer Schnittstelle stellt eine Art Vererbung dar. Siehe auch Schnittstelle.
Die Schnittstelle gibt an, welche Methoden vorhanden sind (bzw. vorhanden sein müssen) und wie sie zu verwenden sind. Zusätzlich zu dieser syntaktischen Definition sollte stets ein so genannter Kontrakt definiert werden, über den die Bedeutung der verschiedenen Methoden festgelegt wird – also deren Semantik. Der Kontrakt wird meist nur informell in der Dokumentation oder einer externen Spezifikation der Schnittstelle festgelegt, doch stehen auch formelle Spezifikationssprachen wie z. B. die OCL zur Verfügung.
Schnittstellen repräsentieren eine Garantie bezüglich der in einer Klasse vorhandenen Methoden. 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 (in Java mit dem Schlüsselwort interface). Andere Sprachen (meist solche, die Mehrfachvererbung unterstützen, wie C++ ) kennen zwar das Konzept von Schnittstellen, behandeln diese aber ganz genauso wie normale Klassen. Man spricht dann auch von rein abstrakten Klassen. Manchmal wird auch eine eigene Sprache (eine sogenannte Interface Definition Language, IDL) zur Deklaration der Schnittstelle verwendet – meist ist das bei Middleware-Systemen wie CORBA oder DCOM der Fall. Objektorientierte Sprachen ohne strenge Typisierung (vor allem Skriptsprachen wie Python oder JavaScript) kennen meist keine Schnittstellen.
Inhaltsverzeichnis |
[Bearbeiten] Beispiel für eine Schnittstelle
Existiert beispielsweise eine Schnittstelle Konto
, müssen alle Klassen, die diese Schnittstelle implementieren, auch die Methoden bereitstellen, die die Schnittstelle definiert hat. Existieren beispielsweise die Klassen SparKonto
, GiroKonto
und DepotKonto
, und definiert die Schnittstelle Konto
die Methode getKontostand
, so müssen alle Klassen diese Methode bereitstellen.
Werden in einer Klasse mehrere Schnittstellen implementiert und besitzen diese 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 hat den Vorteil gegenüber .NET-Sprachen, dass ein Interface nicht in einer Klasse implementiert werden muss, um instanziert zu werden;
public Konto erstelleKonto() { Konto k = new Konto() { public int getKontostand() { return 0; } }; return k; }
[Bearbeiten] Namenskonventionen
In einigen Programmiersprachen ist es üblich, Schnittstellen durch besondere Präfixe oder Suffixe erkennbar zu machen. So wird häufig ein „I“ (für Interface) vorangestellt oder ein „IF“ angehängt. Die oben angeführte Beispielschnittstelle Konto
hieße dann IKonto
oder KontoIF
.
- Vorteile
- Schnittstellen sind am Namen als solche erkennbar.
- Implementierende Klassen können einen einfacheren Namen haben.
- Nachteile
- 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.
[Bearbeiten] Konstanten in Java
In Java ist es ferner möglich, Konstanten innerhalb einer Schnittstellendefinition zu deklarieren. Allen implementierenden Klassen stehen dann diese Konstanten zur Verfügung. Da Java, und auch Sprachen wie C#, keine Mehrfachvererbung unterstützt, werden Schnittstellen oft auch als Brücke benutzt, um eine 'virtuelle' Mehrfachvererbung zu implementieren, bei der eine Klasse bzw. deren Instanz über verschiedene Schnittstellen/Signaturen ansprechbar ist.