Duplicar posibles:
Casting List<T> - covariance/contravariance problemdevolver una lista de clase abstracta
tengo clases definidos de la siguiente manera
public abstract class AbstractDType
{
protected abstract string Num1 { get; set; }
protected abstract string Num2 { get; set; }
}
public class AD1 : AbstractDType
{
public string Num1 { get; set; }
public string Num2 { get; set; }
public string Num3 { get; set; }
}
public class AD2 : AbstractDType
{
public string Num1 { get; set; }
public string Num2 { get; set; }
public string Num3 { get; set; }
}
public abstract class DTypeStrategy
{
protected virtual List<AbstractDType> GetData()
{
return new List<AD1>();
}
}
me gustaría devolver una lista de PD1 (tipo concreto) en el método GetData(). Sin embargo, el código anterior arrojó un error de lanzamiento. List<AbstractDType>
no se puede convertir a List<PD1>
. ¿Cómo soluciono este error para poder devolver el hormigón en el método GetData?
Hay otras clases derivadas que heredaron de DTypeStrategy que serían de aplicación GetData(), como a continuación: (Estoy suponiendo que voy a conseguir el mismo error de fundición aquí también)
public class MyDraw : DTypeStrategy
{
public override List<AbstractDType> GetData()
{
return new List <AD2>();
}
}
Estoy usando Strategy Pattern para crear objetos concretos basados en typeID. El método GetData() de cada objeto concreto devolverá una lista específica como Lista de AD1, AD2 o AD3. AD1, AD2 y AD3 heredados de AbstractDType. DTypeStrategy tendría el método GetData() con comportamiento predeterminado. –
@Alan B En un patrón de estrategia, el código que llama a sus estrategias no debería necesitar saber qué devuelve la lista concreta 'GetData', por lo que el fragmento superior sería el que desee: cree la lista a partir del resumen y agregue instancias de subclases a ella. –