2010-09-21 5 views
2

J'ai une question concernant les interfaces. J'ai compris que vous ne pouvez pas créer des instances d'interfaces, n'est-ce pas? Cependant, je vois sur l'utilisation de la page de démontrer l'interface IDictionaryEnumerator:référençant une interface

// Loop through all items of a Hashtable 
IDictionaryEnumerator en = hshTable.GetEnumerator(); 
while (en.MoveNext()) 
{ 
    string str = en.Value.ToString(); 
} 

est-ce pas la création d'un objet nommé en de type IDictionaryEnumerator? Je l'ai lu GetEnumerator() en essayant de comprendre ce qu'il retourne:

Renvoie une référence à un objet recenseur , qui est utilisé pour itérer sur un objet de collection.

..mais je ne comprends pas vraiment quand devrais-je créer de telles références d'interfaces au lieu d'objets de classe. Je veux dire quel est l'avantage de le faire.

Merci d'avance.

Répondre

3

Ceci est juste une démo de polymorphisme - Le hshTable.GetEnumerator() vous renvoie une instance qui regarde le monde extérieur comme IDictionaryEnumerator. Cette instance peut présenter un comportement différent de celui par exemple d'une instance obtenue à partir de myFactory.GetEnumerator(). Les deux objets ressemblent à IDictionaryEnumerator mais ont différentes implémentations des méthodes exposées par l'interface IDictionaryEnumerator. J'espère que cela aide.

+0

ok, donc quand je dis "IDictionaryEnumerator en =" cela signifie que quelle que soit l'implémentation, l'objet sera toujours un type IDictionaryEnumerator.C'est logique mais je ne comprends pas vraiment quand j'ai besoin de ce type de flexibilité; pourquoi ne devrais-je pas simplement créer une instance de la classe qui implémente IDictionaryEnumerator directement? –

+0

Si vous n'en avez pas besoin alors il est bon de créer l'instance par exemple Honda h = new Honda() au lieu de Car h = new Honda(). Mais pensez à une méthode générique qui accepte tous les types de Car et appelle la méthode run sur cela. Le comportement sera différent en fonction de ce que vous envoyez. Honda va dire bonjour je vais commencer. BMW dira vrooommm ... (je ne possède pas une Honda ou une BMW juste un ex :)). Vous n'avez pas besoin d'écrire deux méthodes différentes pour accepter une Honda et une autre pour accepter une BMW. – OpenSource

+0

merci qui a du sens. –

2

Le code crée une instance d'une classe qui implémente l'interface

Une classe peut implémenter plusieurs interfaces et plusieurs classes peuvent implémenter la même interface

En utilisant une interface, vous dépendez moins sur un spécifique implémentation mais juste à une interface (contrat)

+0

je vous remercie pour votre réponse, je l'ai lu de msdn, mais je ne sais toujours pas quand devrais-je déclarer une référence de type interface, je veux dire quel est l'avantage de faire cela plutôt qu'un objet direct de cette classe . –

+0

L'avantage est que si demain l'implémentation (la classe qui implémente l'interface) change, vous n'avez pas besoin de changer votre code. Tout ce que vous voulez/devez savoir, c'est que la classe respecte un contrat que vous pouvez utiliser. Je vous ai vu accepter une réponse, j'espère que tout est clair maintenant :) –

1

Une variable d'un type d'objet peut être considérée comme contenant un "identifiant d'objet". Les seules choses qui peuvent être faites directement avec un ID d'objet sont de l'assigner à un autre ID d'objet, ou de le comparer à un autre ID d'objet. Dire someObject.foo dit effectivement "prendre l'objet référencé par l'ID d'objet dans la variable" someObject ", et utiliser la méthode" foo "dessus

Une interface peut être considérée comme un panneau de connexion supplémentaire qui est attaché à un objet, avec un ensemble de connexions normalisées Si une variable est déclarée être de type interface, elle va contenir l'ID d'un objet qui a un tel panneau, et dire "someInterface.foo" dit d'utiliser le "foo" méthode du panneau (qui sera à son tour connecté à - et activer - une méthode dans l'objet lui-même)

Notez que pour qu'une interface soit utilisable, ses connexions externes doivent être câblées à quelque chose à l'intérieur Pour instancier juste une interface serait de faire un panneau sans rien connecté. Il n'y aurait aucun moyen pour que les méthodes effectuées sur l'interface aient un effet, car il n'y aurait aucune implémentation câblée pour aucune d'entre elles.

Questions connexes