Konzeptionell ist ein interfaz wird verwendet, um eine Reihe von Methoden, die ein Objekt zur Verfügung stellt, formal und semi-formal zu definieren. Formal bedeutet eine Reihe von Methodennamen und -signaturen, und halb-formal bedeutet eine für den Menschen lesbare Dokumentation zu diesen Methoden.
Schnittstellen sind nur Beschreibungen einer API (schließlich, API steht für Anwendungsprogrammierung interfaz ), können sie keine Implementierung enthalten, und es ist nicht möglich, eine Schnittstelle zu verwenden oder auszuführen. Sie legen lediglich den Vertrag fest, wie Sie mit einem Objekt interagieren sollen.
Klassen bieten eine Implementierung an und können erklären, dass sie keine, eine oder mehrere Schnittstellen implementieren. Wenn eine Klasse vererbt werden soll, ist es üblich, dem Klassennamen das Wort "Base" voranzustellen.
Es wird unterschieden zwischen einer Basisklasse und ein abstrakte Basisklassen (ABC). ABCs vermischen Schnittstelle und Implementierung miteinander. Abstrakt bedeutet außerhalb der Computerprogrammierung "Zusammenfassung", d.h. "abstrakt == Schnittstelle". Eine abstrakte Basisklasse kann dann sowohl eine Schnittstelle als auch eine leere, teilweise oder vollständige Implementierung beschreiben, die vererbt werden soll.
Meinungen über den Zeitpunkt der Verwendung Schnittstellen gegen abstrakte Basisklassen versus nur Klassen wird sehr unterschiedlich sein, je nachdem, was Sie entwickeln und in welcher Sprache Sie entwickeln. Schnittstellen werden oft nur mit statisch typisierten Sprachen wie Java oder C# in Verbindung gebracht, aber auch dynamisch typisierte Sprachen können über Schnittstellen y abstrakte Basisklassen . In Python zum Beispiel wird klar unterschieden zwischen einer Klasse, die angibt, dass sie implementiert eine interfaz und ein Objekt, das eine Instanz eines Klasse und gilt als anbieten. que interfaz . In einer dynamischen Sprache ist es möglich, dass zwei Objekte, die beide Instanzen desselben Klasse können erklären, dass sie vollständig verschiedene Schnittstellen. In Python ist dies nur für Objektattribute möglich, während Methoden ein gemeinsamer Zustand für alle Objekte einer Klasse . In Ruby können Objekte jedoch Methoden pro Instanz haben, so dass es möglich ist, dass die interfaz zwischen zwei Objekten desselben Klasse kann so weit variieren, wie der Programmierer es wünscht (Ruby hat jedoch keine explizite Möglichkeit, Interfaces zu deklarieren).
In dynamischen Sprachen wird die Schnittstelle zu einem Objekt oft implizit angenommen, entweder durch Introspektion eines Objekts und die Frage, welche Methoden es bietet ( Vorsicht vor dem Sprung ) oder vorzugsweise durch den einfachen Versuch, die gewünschte interfaz auf ein Objekt und das Abfangen von Ausnahmen, wenn das Objekt diese Funktion nicht bietet interfaz ( es ist einfacher, um Vergebung zu bitten als um Erlaubnis ). Dies kann zu "falsch-positiven" Ergebnissen führen, wenn zwei Schnittstellen haben denselben Methodennamen, sind aber semantisch unterschiedlich. Der Kompromiss besteht jedoch darin, dass Ihr Code flexibler ist, da Sie nicht im Voraus zu viele Angaben machen müssen, um alle möglichen Verwendungen Ihres Codes vorherzusehen.
11 Stimmen
Nur ein Punkt, den Sie meiner Meinung nach berücksichtigen sollten - Schnittstellen können verschiedene Einschränkungen mit sich bringen, derer Sie sich möglicherweise erst in sehr späten Phasen bewusst sind. Zum Beispiel mit .NET können Sie nicht serialisieren eine Schnittstelle Mitglied Variable, so dass, wenn Sie eine Klasse Zoo und ein Mitglied Variable Array von IAnimals haben Sie nicht in der Lage, Zoo serialisieren (und das bedeutet, schreiben WebServices oder andere Dinge, die eine Serialisierung wäre ein Schmerz).
2 Stimmen
Diese Frage könnte helfen, das Konzept der Schnittstellen zu verstehen. stackoverflow.com/q/8531292/1055241
0 Stimmen
Ich bin nur neugierig. Ich traf in der CLR über C# den folgenden Auszug:
I tend to prefer using the interface technique over the base type technique because the base type technique doesn’t allow the developer to choose the base type that works best in a particular situation.
. Ich kann nicht begreifen, was in dem Auszug gemeint ist. Wir können einige Basistypen erstellen und für jeden von ihnen einen abgeleiteten Typ erstellen, so dass ein Entwickler einen Basistyp auswählen kann. Könnte mir bitte jemand erklären, was ich übersehe? Ich glaube, es kann ein Teil dieser Frage sein. Oder sollte ich eine andere Frage zu dem spezifischen Auszug stellen?