OVH Cloud OVH Cloud

Voudrai bien comprendre - suite

2 réponses
Avatar
JO
( et fin je l'espère ) !
J'ai peut être mal posé ma question !
Suis ok sur le principe qu'une interface est un contrat, qui ne fournit pas
d'implémentation .... ( ça on le trouve dans toutes les docs ! )
Mais la ou je ne pige pas, c'est que je pensais qu'on ne pouvait pas utiliser
directement une interface ( comme une classe ) et qu'il fallait nécessairement
créer une classe qui implémente l'interface !!!!

Et bien ce n'est pas le cas du tout !! Si je reprends mon exemple
Idatareader, et bien :

Dim DtRead as SqlDatareader ou Dim DtRead as Idatareader

et bien mon code fonctionne et produit le même résultat --> ce qui signifie
qu'on
peut directement utiliser une interface ou alors c'est un raccourci proposé
par VS ??

Help Me

Merci encore

Jo

on peut l'utiliser en .NET directement

2 réponses

Avatar
Julien Bakmezdjian [MS]
Bonjour,

Effectivement, au moment de la déclaration, pas beaucoup de différence...
En revanche, vous ne pourrez jamais instancier un objet avec une interface :
DtRead = New IDataReader
n'a absolument aucun sens, puisque le code de la méthode Read par exemple
n'existe pas dans Idatareader !

En revanche :
Dim DtRead as IDataReader
DtRead = New SqlDataReader
est correct.

En effet, DtRead est déclaré comme une interface. Nous savons donc que
DtRead a une méthode Read. Et effectivement, nous affectons à DtRead un
objet implémentant IDataReader (voir la documentation) et donc la méthode
Read.

Voici un exemple qui montre l'intérêt des interfaces :

Si je crée une fonction AfficheEnregistrements :

Sub AfficheEnregistrements(reader as IDataReader)
While reader.Read()
' . . .
End While
End Sub

Cette fonction prend en entrée un IDataReader sur lequel je peux appeler la
méthode Read... Pas d'erreur puisque Read existe bien au sein de
IDataReader. Si maintenant j'utilise cette fonction (ou si je la fournie à
quelqu'un), je peux l'utiliser avec un objet SqlDataReader ou un objet
OleDbDataReader... le même code fonctionnera indifféremment puisque
SqlDataReader et OleDbDataReader implémentent tout deux IDataReader.

J'espère avoir été clair,

Cordialement,

Julien Bakmezdjian

"JO" a écrit dans le message de news:

( et fin je l'espère ) !
J'ai peut être mal posé ma question !
Suis ok sur le principe qu'une interface est un contrat, qui ne fournit
pas
d'implémentation .... ( ça on le trouve dans toutes les docs ! )
Mais la ou je ne pige pas, c'est que je pensais qu'on ne pouvait pas
utiliser
directement une interface ( comme une classe ) et qu'il fallait
nécessairement
créer une classe qui implémente l'interface !!!!

Et bien ce n'est pas le cas du tout !! Si je reprends mon exemple
Idatareader, et bien :

Dim DtRead as SqlDatareader ou Dim DtRead as Idatareader

et bien mon code fonctionne et produit le même résultat --> ce qui
signifie
qu'on
peut directement utiliser une interface ou alors c'est un raccourci
proposé
par VS ??

Help Me

Merci encore

Jo

on peut l'utiliser en .NET directement


Avatar
JO
Merci beaucoup pour la réponse !!

En fait je faisais l'amalgame entre la déclaration de type Interface
et l'objet effectivement utilisé qui est de type lui SqlDatareader.

Merci encore