Ich lerne Java, ich habe die folgende Beschreibung über interface in einem Buch gesehen:
Wenn eine Variable als Interface-Typ deklariert ist, dann einfach bedeutet, dass das Objekt diese Schnittstelle implementiert haben soll.
Was bedeutet das? Wenn ich eine Schnittstelle definiere:
%Vor%Dann erkläre ich eine Variable als einen Schnittstellentyp zum Beispiel:
%Vor%Ich bin völlig verwirrt durch die Beschreibung des Buches ...
Sie können keine Schnittstelle instantiieren, d. h. Sie können nicht
%Vor% Sie können eine Klasse instanziieren, die die Schnittstelle implementiert. Das heißt, eine Klasse MyClass
Sie können es instanziieren und einen Verweis darauf in Ihrer Variablen wie folgt platzieren:
%Vor% Wenn Sie eine andere Klasse hatten, die MyInterface
Sie können auch einen Verweis auf die Instanz dieser Klasse unter Ihrer Variablen ersetzen:
%Vor%Hier liegt die Stärke von Schnittstellen: Sie definieren Typen , nicht eine bestimmte Implementierung und lassen Sie auf eine Implementierung eines bestimmten Typs verweisen.
Es ist eine sehr gute Programmierpraxis, Klassen dazu zu bringen, Schnittstellen zu implementieren und diese zu verwenden, um auf Instanzen dieser Klassen zu verweisen. Diese Vorgehensweise ermöglicht ein hohes Maß an Flexibilität und Wiederverwendung.
Daher sollten Sie Argumente und Variablen vom Typ interface immer dann verwenden, wenn es denkbar ist, dass verschiedene Implementierungen an die von Ihnen implementierte Methode übergeben werden. Wenn Sie beispielsweise mit einer HashSet<T>
-Instanz arbeiten, sollten Sie eine Variable vom Typ Set<T>
verwenden, um darauf zu verweisen (die Klasse HashSet<T>
implementiert die Schnittstelle Set<T>
).
Sie können eine Schnittstelle nicht instanziieren. Aber Sie können Ihre Variable mit dem Namen der Schnittstelle eingeben:
%Vor% Angenommen, MyObject
implementiert MyInterface
.
Dies kann nützlich sein, wenn Sie beispielsweise Objekte von einer externen Quelle erfassen.
In einem solchen Fall kennen Sie den realen Objekttyp nicht (und interessieren ihn auch nicht).
Sie müssen nur wissen und sicherstellen, dass es eine Schnittstelle implementiert, sodass Sie Schnittstellenmethoden für das Objekt aufrufen können.
Angenommen, Sie haben die folgende Variable:
%Vor% Und zwei Klassen ( Foo
und Bar
), die beide MyInterface
implementieren.
Sie können dann die Variablen foo
Instanzen von Foo
und Bar
zuweisen.
Dasselbe gilt natürlich auch für Methodenargumente.
Sie instanziieren keine Schnittstelle. Sie erstellen Klassen, die die Schnittstelle implementieren, diese instanziieren, aber auf die Schnittstelle verweisen (im Gegensatz zur implementierenden Klasse).
Dies ermöglicht Ihrem Code, umsetzungsneutral zu bleiben, ähnlich wie bei der Verwendung einer List
-Referenz, aber einer ArrayList
-Implementierung.
Wenn es mit der Abhängigkeitsinjektion kombiniert wird, vereinfacht das auch das Testen und die Erweiterbarkeit.