web-dev-qa-db-fra.com

Utilisation de génériques dans les classes abstraites

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?

20
thaBadDawg

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
31
Nick Craver
  • Vous devez déclarer le type T.
  • Vous devez déclarer la classe AbstractClass en tant qu'abstrait.
  • Vous devez utiliser le mot-clé override.

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; }
}
9
Mark Byers

Vous devez rendre AbstractClass generic

public class AbstractClass<T> {
  ...
}

public class Container : AbstractClass<Widgets> { ...
}
5
JaredPar
  1. Vous devez marquer AbstractClassabstract, car il contient la propriété abstract

  2. Spécifiez le type générique dans la déclaration AbstractClass

  3. 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; }
}
3

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; }
}
2
JDMX

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; }
}
1
Reed Copsey

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();
    }
}
}
0
Humayoun Kabir