2011-03-09 12 views
5

Me preguntaba si este código podría mejorarse. El proveedor de servicios implementa IProvider y sobrescribe la solicitud (...). Me gustaría combinarlos en una sola interfaz. Pero todavía necesito una interfaz mecanografiada y sin tipo para trabajar.¿Es posible definir una interfaz no genérica que puede tener métodos genéricos?

¿Hay alguna manera de combinar estos en los que obtengo ambos o así es como deberían verse las interfaces?

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 

public interface IProvider<T> : IProvider 
{ 
    new IResult<T> Request(IQuery request); 
} 
+0

Seguí instrucciones de ustedes y funcionó como yo quería. Solo puedo dar 1 ganador lo siento. – phillip

+0

La próxima vez es posible que desee verificar dos veces el jefe "más antiguo". – VulgarBinary

+0

editó el suyo después de él, que es por lo que obtiene el cheque. – phillip

Respuesta

5

Si el parámetro de tipo genérico T sólo es relevante en el contexto del método Request, declarar solamente ese método como genérico:

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 

    IResult<T> Request<T>(IQuery request); 
} 
+0

bien. eso es bueno saber ... gracias. – phillip

+0

Quien me votó: es inútil, si no lo explica, ¡por qué lo hizo! ¡Especialmente, después de que la respuesta ya ha sido aceptada ...! –

+0

Creo que era VulgarBinary ... Estaba hablando de cómo debería haberse elegido su respuesta y ahora se borra su diatriba. Sin embargo, creo que otro miembro podría haber eliminado sus comentarios innecesarios, no estoy seguro. – phillip

2

Si usted quiere tener la capacidad de ejecutar código sin tipo no se puede poner ese método dentro de una clase genérica (y tienen todavía hacer el diseño sentido del reloj). Entonces la respuesta es no ... lo que tienes es el enfoque correcto cuando necesitas interfaces tipeadas y sin tipo.

Sin embargo, puede tener una referencia a la interfaz inicial o rodar a todos en una sola interfaz, pero sus métodos sin tipo todavía tendrá que ser declarada dentro de una clase genérica, es decir:

ObjectProvider<SomeObjectType> j = new ObjectProvider<SomeObjectType>(); 
j.DataSource = //Do something 

Ahora, siempre podría especificar Request como método genérico y permitir que ambos existan en el mismo contexto ... pero ... Eso depende de ti.

public interface IProvider 
{ 
    IResult<T> Request<T>(IQuery request); 

    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 
+0

buena respuesta. gracias por la respuesta. – phillip

0

En realidad, la implementación de la interfaz significa que está dejando de la interfaz base miembros en el niño también - la herencia funciona de esta manera, por supuesto.

Entonces, ¿qué sucederá cuando implemente su interfaz hija (genérica) en alguna clase? Por supuesto, obtendrás miembros genéricos y no genéricos en la clase de implementador, que no es exactamente lo que quieres, como yo lo entiendo.

Solución:

  1. interfaz base declare (por ejemplo IProviderBase) que contiene "origen de datos" y miembros "configuración" solamente.
  2. hacen que IProvider sea el hijo de IProviderBase y declare Request() no genérico en él.
  3. make IProvider <T> el elemento secundario de IProviderBase y declare la solicitud genérica <T>() en ella.

¿Tiene sentido?

Cuestiones relacionadas