Je travaille sur une classe abstraite où la classe d'implémentation doit implémenter une liste de T. Le problème est que cela ne fonctionne pas:
public class AbstractClass
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass
{
public List<Widgets> Items { get; set; }
}
Je suis sûr qu'il me manque une réponse évidente et je sais que je peux créer un type de base abstrait à mettre dans la liste, mais lorsque j'utilise ma commande Linq pour construire la liste, le type abstrait (ItemBase ) ne fonctionne pas bien avec la méthode .ToList (). Est-ce que ce que j'essaie de faire est unique?
Vous devez également connaître la déclaration sur la classe pour savoir quel type T
est:
public abstract class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public List<Widgets> Items { get; set; }
}
Vous pouvez aussi restreindre ce que T peut être, par exemple, il doit implémenter IWidgets
:
public class AbstractClass<T> where T : IWidgets
Essaye ça:
public class Widgets { }
public abstract class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public override List<Widgets> Items { get; set; }
}
Vous devez rendre AbstractClass
generic
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
Vous devez marquer AbstractClassabstract
, car il contient la propriété abstract
Spécifiez le type générique dans la déclaration AbstractClass
Implémenter une propriété abstraite avecoverride
public abstract class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public override List<Widgets> Items { get; set; }
}
Vous devez définir T comme si
public class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass<Widget>
{
public List<Widgets> Items { get; set; }
}
Vous devez spécifier le type dans la classe abstraite:
public class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public List<Widgets> Items { get; set; }
}
Il vous manque la définition d'un mot clé abstrait pour votre classe AbstractClass et vous devez également ajouter un mot clé de remplacement pour la propriété Container Class Items. Je donne l'exemple de code qui fonctionnera à coup sûr.
namespace AbstractGeneric
{
public abstract class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Widgets
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public override List<Widgets> Items { get; set; }
public Container()
{
Items = new List<Widgets>();
}
}
class Program
{
static void Main(string[] args)
{
Container c = new Container();
c.Items.Add(new Widgets() { ID = 1, Name = "Sample Widget 1" });
c.Items.Add(new Widgets() { ID = 2, Name = "Sample Widget 2" });
foreach (Widgets item in c.Items)
{
Console.WriteLine(item.ID + " : " + item.Name);
}
Console.ReadLine();
}
}
}