2009-05-22 12 views
3

Was benötigt IDictionary-Schnittstelle? Wie kann die IDictionary-Schnittstelle initialisiert werden? Schließlich ist es nur eine Schnittstelle. Das folgende Code-Snippet stammt von msdn. Ich konnte es nicht verstehen.Zweck der IDictionary-Schnittstelle

IDictionary<string, string> openWith = new Dictionary<string, string>(); 

Antwort

11

Es definiert die wichtigen functions, dass ein Wörterbuch implementieren sollte.

Die Linie von MSDN bedeutet, dass ein Objekt Openwith schaffen, die die Funktionen (Methoden) in IDictionary Schnittstelle definiert implementiert.

Wenn Sie Wörterbuch verwenden, um die Variable wie zu deklarieren:

Dictionary<string,string> openWith=.....; 

Sie binden mit der konkreten Art des Objekts. Aber wenn Sie

IDictionary<string,string> openWith=....; 

Sie es mit einem Objekt verwenden können, die IDictionary implementiertSchnittstelle, vielleicht Ihre eigene Klasse :)

9

Der ganze Sinn der Schnittstellen zu schaffen, ... na ja eine Schnittstelle zu jedem beliebigen Modul (ich benutze hier "Modul" in einem weiten Sinn), so dass sich der Anrufercode nicht darum kümmern muss, wie diese spezielle Schnittstelle implementiert wird.

Wie "Wie kann IDictionary Schnittstelle initialisiert werden", ist dies technisch nicht korrekt. Was initialisiert werden kann, ist eine Variable, deren Typ IDictionary<T, V> ist. Sicher genug Variablen müssen initialisiert werden, aber das ist normalerweise vor dem "Client-Code" verborgen.

IDictionary ist jedoch nicht sehr repräsentativ. Betrachten Sie stattdessen eine IDataReader Schnittstelle. Sie haben sicherlich mit ADO.NET behandelt, so sollte dies bekannt vorkommen:

public Foo PopulateFromDataReader(SqlDataReader dataReader) 

Diese besondere Methode fest an einem SqlDataReader gekoppelt ist, so dass Sie es neu schreiben müssen, würde für sie zu unterstützen, sagen wir, Access oder Oracle oder MySQL oder Firebird oder was auch immer. Mit anderen Worten, Sie sind auf die Implementierung angewiesen.

Nun betrachten:

public Foo PopulateFromDataReader(IDataReader dataReader) 

Diese Methode kann mit dem, was Klasse verwendet werden, die IDataReader implementiert, die mit grundsätzlich jedem ADO.NET-kompatiblen Datenprovider bedeutet.

+0

+1 Sehr schönes Beispiel .. :) Sie räumten die Diff, die mich verwirren machte ... großes Beispiel. –

5

Es wäre nicht anders als jede andere Schnittstelle. Versuchen Sie, über ein einfacheres Beispiel denken:

interface IThermometer 
{ 
    double CurrentTemperature { get; } 
} 

Jetzt haben wir einen Weg, um die Temperatur zu bekommen, obwohl wir nicht genau egal, wie es gemessen wird.

class MercuryThermometer : IThermometer 
{ 
    public double CurrentTemperature 
    { 
     get { return ... /* gets the temperature somehow */ } 
    } 
} 

Der Rest des Programms braucht nicht zu wissen, welche Thermometer ist es mit: Wir können verschiedene Implementierungen erstellen.

+0

+1 für dieses Beispiel ... –

1

Ich vermute, Sie haben einfach den Unterschied zwischen der Variablen übersehen getippt als IDictionary<,> (die Schnittstelle), und der Wert (Referenz) initialisiert als Dictionary<,> (beachten Sie keine I, den Beton-Typ).

1

Es ist auch nützlich für Unit-Tests. Sie können einen Komponententest für eine Methode schreiben, die ein IDictionary anstelle eines Dictionary akzeptiert und einen Schein ausführt. Wenn es eine Klasseninstanz akzeptieren würde (die auch versiegelt werden könnte), wären Sie ein wenig verwirrt (Sie müssten das Adaptermuster usw. verwenden).