es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Combinando genéricos de interfaces en Listas.

Lo siento si esta pregunta no está formulada correctamente ya que soy bastante nuevo en la programación genérica. Por lo tanto, es posible que algunos términos no se utilicen correctamente, pero espero que entiendas mi problema.

Lo que me gustaría lograr:

Quiero una clase base o mejor aún, una interfaz base que tenga múltiples tipos genéricos. A partir de esta base, me gustaría crear múltiples clases. Estas clases derivadas no deben tener una declaración de los tipos al inicializar, ya que me gustaría usarlos como alias.

Ejemplo:

  • Interfaz base
    public interface IWidgetHandler<t1, t2,="" t3="">
    {
      protected T1 Config { get; set; }
      protected T1 ParseConfig();
      public T2 GetConfigResponse();
      public T3 ProcessRequest(T2 r);
    }
    
  • Clase derivada
    public class SomeWidget : IWidgetHandler<bool, bool,="" bool="">
    {
      protected bool Config { get; set; }
      protected bool ParseConfig();
      public bool GetConfigResponse();
      public bool ProcessRequest(bool r);
    }
    
    public class SomeOtherWidget : IWidgetHandler<bool, byte,="" bool="">
    {
      protected bool Config { get; set; }
      protected bool ParseConfig();
      public byte GetConfigResponse();
      public bool ProcessRequest(byte r);
    }
    

Hasta ahora funciona bien, pero también me gustaría poder combinarlos en una lista y algo como List<><dynamic,dynamic,dynamic>> no funciona. ¿Cómo puedo lograr esto?

Gracias de antemano.</dynamic,dynamic,dynamic></bool,></bool,></t1,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    Para lograr el comportamiento deseado, puede utilizar parámetros de tipo covariante y contravariante en la definición de la interfaz. Esto permite relaciones de herencia entre interfaces que difieren sólo en sus argumentos de tipo.

    En primer lugar, debe marcar los parámetros de tipo como covariantes utilizando la palabra clave out para los tipos de salida y contravariantes utilizando la palabra clave in para los tipos de entrada.

    public interface IWidgetHandler<out t1,="" out="" t2,="" in="" t3="">
    {
        T1 Config { get; set; }
        T1 ParseConfig();
        T2 GetConfigResponse();
        T3 ProcessRequest(T2 r);
    }
    

    Esta definición le permite crear una lista de tipos mixtos que implementan la interfaz IWidgetHandler:

    List<><object, object,="" object="">> myList = new List<><object, object,="" object="">>();
    myList.Add(new SomeWidget());
    myList.Add(new SomeOtherWidget());
    

    En este ejemplo, el tipo object se utiliza como marcador de posición para los parámetros genéricos de tipo.

    Ahora puede llamar a los métodos en los elementos de la lista sin conocer sus tipos específicos:

    foreach (var item in myList)
    {
        var response = item.GetConfigResponse();
        var processed = item.ProcessRequest(response);
    }
    

    Tenga en cuenta que para los parámetros de tipo contravariante, solo puede usarlos como parámetros de entrada, por ejemplo, en argumentos del método. No puede usarlos como tipos de salida o parámetros de tipo genérico en métodos o propiedades.</object,></object,>

Comments are closed.