2009-02-04 21 views
10

Hola a todos,Método devolver una interfaz

estoy pensando en esta línea de código

IDataReader myReader = questDatabase.ExecuteReader(getQuest); 

estoy usando DAAB pero no puedo entender cómo y cuál es el significado de la De hecho, el método ExecuteReader (DbCommand) devuelve una interfaz IDataReader.

alguien puede explicar, por favor

+0

estoy aprendiendo las interfaces y tenía exactamente la misma pregunta. La respuesta de Pablito fue exactamente lo que estaba buscando y confirmó que estaba construyendo mi implementación correctamente. ¡¡Gracias chicos!! –

Respuesta

15

Le permite DataReader sin la necesidad de saber qué tipo de DataReader está utilizando (es decir, SqlDataReader, OleDbDataReader, EtcDataReader), por lo que si algún día quiere cambiar el lector de datos que está utilizando no le afectará la lógica, en otras palabras te da abstracción. Por ejemplo:

puede utilizar

IDbCommand command = GiveMeSomeCommand(); 
IDataReader r = command.ExecuteReader(); 

sin saber qué proveedor está utilizando

puede ser:

private static IDbCommand GiveMeSomeCommand() 
{ 
    return new OleDbCommand(); 
} 

o puede ser

private static IDbCommand GiveMeSomeCommand() 
{ 
    return new SqlCommand(); 
} 

o lo que sea.

EDIT:

También puede utilizar los DBFactories.

DbProviderFactory factory = GiveMeSomeFactory(); 
IDbCommand command = factory.CreateCommand(); 
IDataReader r = command.ExecuteReader(); 

//and create more objects 
IDataAdapter adapter = factory.CreateDataAdapter(); 
IDbConnection conn = factory.CreateConnection(); 

y luego crear su proveedor en otra capa

private DbProviderFactory GiveMeSomeFactory() 
{ 
    if(something) 
     return SqlClientFactory.Instance; 
    else if(somethingElse) 
     return OracleFactory.Instance; 
    else if(notThisAndNotThat) 
     return MySqlFactory.Instance; 
    else 
     return WhateverFactory.Instance; 

} 
+2

Realmente les agradezco a TODOS, estoy sorprendiendo en su dedicación, es gratísimo estar en una comunidad como esta. Gracias All – netseng

4

Devuelve una interfaz debido a que la implementación de la interfaz no es importante, sólo la API que proporciona la interfaz.

+0

Realmente te agradezco TODO, estoy sorprendido por tu dedicación, es gratificante estar en una comunidad como esta. Gracias a todos – netseng

3

"devuelve una interfaz" en realidad significa: "Devuelve una instancia de una clase que implementa la interfaz"

En este caso, devuelve un objeto muy similar a un objeto SqlDataReader, que le permite ejecutar métodos como .Read() e implementa las interfaces IDisposable e IDataRecord.

+0

Realmente gracias a TODOS, estoy sorprendido por su dedicación, es gratificante estar en una comunidad como esta. Thanks All – netseng

+0

es un concepto similar al polimorfismo (es decir, un puntero de objeto puede apuntar a cualquier tipo de referencia que herede del objeto? – iliketocode

2

No devuelve una interfaz per se, sino un objeto que admita esa interfaz.

+0

realmente agradezco a todos, me sorprende su dedicación, es gratísimo estar en una comunidad como este. Gracias Todos – netseng

6

El método devolverá un objeto, que es una instancia de una clase, y ese tipo de clase admitirá IDataReader.

El punto es que el tipo de objeto no es importante, solo el hecho de que la clase implementa la interfaz.

Si conduce un automóvil, no necesita saber si se trata de un vado, o un toyota, conduce el automóvil de la misma manera.

La "interfaz" de conducción es la misma, una vez que el automóvil admite la interfaz, puede conducirla.

Lo mismo con IDataReader, una vez que la clase que devuelve admite la interfaz, puede usarla.

+0

, gracias de todo, es genial estar en una comunidad como esta – netseng

2

Devuelve un objeto que implementa esta interfaz en particular, y eso es todo lo que realmente importa. El objeto "es un" IDataReader y puede realizar todos los métodos que tiene IDataReader.

+0

Realmente gracias a todos, estoy sorprendente en su dedicación, es extraordinaria para estar en una comunidad como esta. Gracias Todo – netseng

+0

Eso es lo que me gusta de StackOverflow: p – random

Cuestiones relacionadas