Der Punkt einer Schnittstelle [duplizieren]

7

Ich wundere mich über den Zweck der Verwendung einer Schnittstelle.

Verwenden Sie Schnittstellen? Wenn ja, wann entscheiden Sie sich, sie zu verwenden und wann entscheiden Sie sich, sie NICHT zu verwenden?

Ich habe zur Zeit Schnittstellen für meine Service-Layer und meine Repository-Layer definiert, aber ich frage mich, ob ich an anderen Stellen vergebe, wo sie nützlich wären.

Ich denke, ich verstehe ihren Zweck nicht ganz.

    
Chase Florell 19.10.2010, 18:12
quelle

5 Antworten

9

Eine Schnittstelle definiert einen Vertrag. Jede Klasse, die eine Schnittstelle implementiert, muss diesen Vertrag erfüllen. Dies bedeutet, dass die Klasse Methoden implementieren muss, die in der Schnittstelle definiert sind.

Eine Schnittstelle sagt im Grunde: "Ich definiere etwas, das alle Implementierer tun müssen. Es ist mir egal, wie wie Sie es tun, aber Sie müssen diese Operationen unterstützen, die ich angegeben habe." / p>

Eine weitere Verwendung von Schnittstellen besteht darin, dass Sie sie in Methodensignaturen oder Typdefinitionen verwenden können, um den allgemeinsten Typ eines Objekts anzugeben. Zum Beispiel ist in Java Map eine Schnittstelle, die von anderen Klassen wie HashMap oder LinkedHashMap implementiert wird. Sowohl HashMap als auch LinkedHashMap haben im Wesentlichen den Typ Map . Sie implementieren die gleichen Methoden, aber sie machen die Dinge anders ( LinkedHashMap behält die Reihenfolge bei).

Betrachten Sie die Situation, in der Sie eine Methode haben, die Karten akzeptiert. Wenn Sie keine Schnittstellen hätten, müssten Sie für jeden Kartentyp eine Methode angeben. In der Tat könnten Sie das über überladene Methoden tun, aber dieser Ansatz ist nicht sehr gut. Der bessere Weg besteht darin, den Typ des Methodenarguments als Map anzugeben. Dann kann jede Klasse, die Map implementiert, an die Methode übergeben werden. Auf diese Weise müssen Sie nicht für jeden Kartentyp eine Methode angeben, und Sie beschränken auch nicht die Person, die Ihre Methode verwendet, auf bestimmte Implementierungen der Karte.

Eine Schnittstelle garantiert auch, dass die angegebene Funktionalität in implementierenden Klassen vorhanden ist. Als solches bietet es auch eine Standardmethode, um auf diese Funktionalität zuzugreifen. Schnittstellen sind auch nützlich, wenn Sie eine API entwerfen (auf diese Weise können Sie eine Standardschnittstelle für die Dinge angeben, die Sie anzeigen möchten).

Ein weiterer Vorteil von Schnittstellen ist, dass sie das Refactoring vereinfachen. Nehmen wir an, Sie möchten eine Implementierung einer Art Objekt ausschalten. Das Objekt könnte ein Methodenargument oder eine Klasseneigenschaft sein. Da Sie dieses Argument oder Objekt als Schnittstelle eingegeben haben, können Sie einfach eine neue Klasse erstellen, die die Schnittstelle implementiert und stattdessen diese Klasse weitergibt. Da Sie die Schnittstelle verwendet haben, haben Sie keine zusätzlichen Annahmen bezüglich der Details der Klasse getroffen. Die Schnittstelle abstrahiert die Implementierungsdetails der von Ihnen verwendeten Klasse. Auf diese Weise machen Sie keine Annahmen, die Ihren Code zu eng an eine bestimmte Implementierung gekoppelt machen.

Um es zusammenzufassen, Schnittstellen sind über Abstraktion und Verträge . Mit abstraktion verbergen Sie die zugrunde liegenden Details und legen nur das Minimum dar, das Sie freilegen müssen. Auf diese Weise wird die Person, die Ihre Klasse oder Schnittstelle verwendet, nicht mit den Implementierungsdetails belastet. All diese Informationen sind in der spezifischen Klasse, die die Schnittstelle implementiert, sauber versteckt. Der Vertrag gewährleistet eine Standardisierung auf der ganzen Linie; Eine Person, die die Schnittstelle verwendet, ist sicher, dass alle Klassen, die die Schnittstelle implementieren, die gleichen Methoden bereitstellen.

    
Vivin Paliath 19.10.2010, 18:19
quelle
6

Eine Schnittstelle dient dazu, anderen zu sagen, dass eine Klasse etwas tut.

z.B. Wenn Sie eine Klasse SoccerPlayer haben, die IInjurable implementiert - wissen Sie aus der ersten Zeile des Klassencodes, eine SoccerPlayer Instanz weiß, was zu tun ist, wenn Sie verletzt sind (Sie wussten das wahrscheinlich kurz nach dem Bindestrich).

Überlegen Sie sich nun, wie Sie IEnumerable implementieren, IQueryable oder IDisposable informiert Sie über ein Objekt, ohne dass etwas über die Implementierung selbst bekannt ist.
Scheint wie eine Menge ..

    
Oren A 19.10.2010 18:44
quelle
2

Eine Schnittstelle ist wie eine Liste von Regeln. Sie bestimmen die Anforderungen einer Klasse, und für jede Klasse, die diese Schnittstelle implementiert, wissen Sie, dass sie diese Regeln befolgen werden. Sie können diese Klassen als diesen Schnittstellentyp darstellen und mit ihnen arbeiten, wobei Sie wissen, dass sie über die Methoden, Eigenschaften und Ereignisse verfügen, die Sie für erforderlich hielten.

Einige wichtige Schnittstellen in ASP.Net sind:

  • ICallbackEventHandler
  • IDisposable

Ich habe kürzlich meine eigene Schnittstelle erstellt, als ich sicherstellen wollte, dass alle Klassen, die für einen bestimmten Zweck verwendet wurden, eine bestimmte Methode und ein bestimmtes Ereignis haben. Wenn ich das wüsste, könnte ich zuerst überprüfen, ob es die Schnittstelle implementiert, indem ich es umwandle und überprüfe:

%Vor%     
Gabriel McAdams 19.10.2010 18:18
quelle
2

Ein Punkt, den viele andere Antworten vermissen, ist, dass Schnittstellen eine sehr begrenzte Form der Mehrfachvererbung ermöglichen, da zwei oder mehr nicht miteinander in Beziehung stehende Klassen eine gemeinsame Schnittstelle implementieren können und Code Objekte akzeptieren kann, die diese Schnittstelle ohne Rücksicht auf irgendetwas anderes implementieren ihr Typ. Andernfalls würde der Code nur dann mehrere Objekttypen akzeptieren und jede allgemeine Funktionalität ausnutzen, wenn alle von einem gemeinsamen Basistyp abstammen, der selbst diese Funktionalität implementiert hat.

    
supercat 19.10.2010 19:26
quelle
0

Wie andere gesagt haben, definiert eine Schnittstelle einen Vertrag, der durch Klassen und Strukturen implementiert werden kann. Dies ermöglicht Schnittstellen wie die Objektvererbung, um Polymorphie zu ermöglichen.

Jedoch unterscheidet sich das Implementieren einer Schnittstelle von der Übernahme von einem Objekt in diesem

  1. Strukturen können ihnen helfen.
  2. Schnittstellen können keine Ergänzungen haben.
  3. Mehr als eine Schnittstelle kann implementiert werden. Dies ermöglicht eine Art von Mehrfachvererbung ohne die zugeordneten Probleme (für gut oder schlecht C # implementiert keine Mehrfachvererbung)

Also im Allgemeinen sind Schnittstellen gut, wenn Sie Polymorphie wollen und Sie wollen

  1. Strukturen
  2. gemeinsame Implementation macht keinen Sinn oder könnte zu einer spröden Basisklasse führen
  3. Es existiert bereits eine Objektvererbung für Ihre Zielklasse

Standardbeispiele sind IDisposable, IComparable und IEnumerable und zeigen die offensichtlichsten Verwendungen.

Einige zu vermeidende Dinge sind Marker-Interfaces (Interfaces ohne Methoden) und Interfaces, die nicht unterstützt werden. Durch das System. z.B. Sie haben IPost, BasePost, Frage, Antwort und Kommentar, aber das System verwendet immer nur BasePost.

    
Conrad Frix 19.10.2010 19:54
quelle