Eine Schnittstelle sagt, wie etwas funktionieren sollte. Betrachten Sie es als einen Vertrag oder eine Vorlage. Es ist der Schlüssel zu Dingen wie Inverson Control oder Dependancy Injection.
Ich verwende Strukturkarte als IoC-Container. Dies ermöglicht mir, eine Schnittstelle für alle meine Klassen zu definieren. Wo Sie
Widget w = new Widget();
sagen könnte würde ich sagen,
IWidget w = ObjectFactory.GetInstance<IWidget>();
Dies ist sehr mächtig, dass mein Code sagt, nicht unbedingt, was wirklich ein Widget ist. Es weiß nur, was ein Widget tun kann, basierend auf der Schnittstelle von IWidget.
Dies hat einige große Macht, dass jetzt, wo ich einen IoC-Container verwende ich ein paar raffinierte Dinge tun kann. In meinen Unit-Tests, wo ich ein Widget verwenden muss, kann ich einen Mock für Widget erstellen. Sagen wir also, dass mein Widget durch die Verbindung mit einer Datenbank oder einem Webdienst etwas sehr Leistungsfähiges tut, kann mein Pseudonym die Verbindung zu diesen Ressourcen simulieren und zu mir zurückgeworfenen Daten zurückkehren. Dadurch läuft mein Test schneller und verhält sich zuverlässiger. Da ich StructureMap benutze, kann ich StructureMap sagen, dass während des produktiven Einsatzes meines Codes und der verspotteten Version des Widgets während des Tests entweder die programmatische oder die Konfiguration die tatsächliche Implementierung meines Widgets laden soll.
Auch weil ich einen IoC-Container verwende, kann ich meiner Anwendung coole neue Funktionen zur Verfügung stellen, wie das Schreiben von drei verschiedenen Möglichkeiten, Daten zwischenzuspeichern. Ich kann einen lokalen Entwickler-Box-Cache verwenden, der ein Tool wie Lucene.NET für einen lokalen Cache verwendet. Ich kann einen Entwicklungsserver verwenden den .NET-Cache, der auf einer Box läuft. Und dann kann ich eine dritte Option für meine Produktionsserver verwenden eine Cache-Schicht wie MemCache Win32 oder Velocity. Solange alle drei Caching-Implementierungen der gleichen Schnittstelle entsprechen, betrifft ihre tatsächliche Implementierung mich (oder meinen Code) überhaupt nicht. Ich frage einfach StructureMap, um die aktuelle Umgebung zu holen und dann zur Arbeit zu gehen.
Wenn Sie Dependency Injection überhaupt verfolgen, dann sind Schnittstellen auch hier mit einem IoC-Container wie StructureMap praktisch, da ich die Verwendung einer Klasse über ein Interface im Konstruktor meiner Klasse deklarieren kann.
public class Widget(IWidgetRepository repository, IWidgetService service) : IWidget
{
//do something here using my repository and service
}
Und dann, wenn ich neue Instanz von Widget haft StructureMap wie dieser
IWidget widget = ObjectFactory.GetInstance<IWidget>();
Hinweis, dass ich bin nicht das Repository oder eine Dienstleistung im Konstruktor angeben. StructureMap weiß über die im Konstruktor angegebenen Schnittstellen, wie man die passenden Instanzen bekommt und diese auch übergibt. Dies macht sehr starken und sauberen Code!
Alles von der einfachen Definition von Schnittstellen und einige kluge Verwendung von ihnen!
Siehe http://stackoverflow.com/questions/56867/interface-vs-base-class und hier http://stackoverflow.com/questions/444245/how-will-i-know-when-to- create-an-interface und eine Suche nach "C# interface" für mehr. – Marc