2010-03-01 6 views
19

je travaille sur une classe abstraite où la classe d'application doit mettre en œuvre une liste de T. Le problème est que cela ne fonctionne pas:Utilisation des génériques dans les classes abstraites

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 que il y a une réponse évidente qui me manque, et je sais que je peux construire un type de base abstrait à mettre dans la liste, mais quand j'utilise ma commande Linq pour construire la liste, le type abstrait (ItemBase) ne joue pas bien avec la méthode .ToList(). Est-ce que ce que j'essaie de faire est si unique?

+0

Il s'avère que j'ai besoin d'apprendre à mieux rechercher. Toutes mes excuses pour toutes les réponses qui n'ont pas été cochées. J'ai choisi le top en raison de sa complétude et du fait qu'il était top. – thaBadDawg

+0

Voulez-vous réellement que les éléments soient abstraits? (c'est-à-dire pour remplacer les propriétés get ou set?) Si vous étendez de 'AbstractClass ' comme la plupart des gens suggèrent, 'Container.Items' sera implicitement un 'List ', et vous n'aurez même pas besoin de le surcharger. – Tanzelax

+0

Je souhaite laisser la possibilité aux méthodes getter et setter d'être surchargées plus tard. En théorie, je n'en ai pas besoin, mais dans la pratique, essayer de défaire ce désordre mène à un monde de blessures. – thaBadDawg

Répondre

26

Vous avez besoin de la déclaration de la classe, ainsi, de 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 également limiter ce que T peut être, comme dire qu'il doit mettre en œuvre IWidgets:

public class AbstractClass<T> where T : IWidgets 
+1

N'oubliez pas d'ajouter le mot clé 'abstract' dans la ligne de déclaration de classe elle-même, pas seulement la propriété. – Nick

+1

Cela ne compile pas. –

5

Vous devez faire AbstractClass générique

public class AbstractClass<T> { 
    ... 
} 

public class Container : AbstractClass<Widgets> { ... 
} 
1

Yo u besoin de 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; } 
} 
2

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; } 
} 
7
  • Vous devez déclarer le type T.
  • Vous devez déclarer la class AbstractClass comme résumé.
  • Vous devez utiliser le mot-clé override.

Essayez ceci:

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; } 
} 
+0

+1 pour la compilation du code – Tanzelax

3
  1. Vous devez marquer AbstractClass abstract, car il contient la propriété abstraite

  2. Indiquez le de type générique dans la déclaration AbstractClass

  3. Mettre en oeuvre la propriété abstraite avec override

 

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; } 
} 
 
0

Il vous manque pour définir mot-clé abstrait pour votre classe AbstractClass et vous devez ajouter mot-clé override pour la propriété Items Container classe. Je donne le code d'exemple 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(); 
    } 
} 
} 
Questions connexes