2010-03-01 5 views
19

Ich bin auf einer abstrakte Klasse zu arbeiten, wo die implementierende Klasse eine Liste von T. implementieren muss Das Problem ist, dass dies nicht funktioniert:Verwendung von Generika in abstrakten Klassen

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

Ich bin sicher, dass Es gibt eine offensichtliche Antwort, die ich vermisse, und ich weiß, dass ich einen abstrakten Basistyp erstellen kann, um ihn in die Liste aufzunehmen, aber wenn ich meinen Linq-Befehl zum Erstellen der Liste verwende, wird der abstrakte Typ (ItemBase) nicht abgespielt schön mit der .ToList() Methode. Ist das, was ich versuche, so einzigartig?

+0

Es stellt sich heraus, dass ich lernen muss, besser zu erforschen. Entschuldigung für alle Antworten, die die gleichen waren, die das Häkchen nicht bekommen haben. Ich entschied mich für das Top, das auf seiner Vollständigkeit und der Tatsache, dass es top war, basierte. – thaBadDawg

+0

Möchtest du wirklich, dass Items abstrakt sind? (zB um die Eigenschaften get oder set zu überschreiben?) Wenn Sie von 'AbstractClass ' ausgehen, wie die meisten Leute vorschlagen, 'Container.Items werden implizit eine "List " sein, und Sie müssen es nicht einmal überschreiben. – Tanzelax

+0

Ich möchte die Möglichkeit lassen, dass die Getter- und Setter-Methoden später außer Kraft gesetzt werden. Theoretisch muss ich das nicht, aber in der Praxis führt der Versuch, dieses Chaos rückgängig zu machen, zu einer Welt der Verletzung. – thaBadDawg

Antwort

26

Sie müssen die Erklärung über die Klasse als auch, zu wissen, welche Art T ist:

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

Sie können auch einschränken, was T sein kann, wie es implementieren muss sagen IWidgets:

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

Vergessen Sie nicht, in der Klassendeklarationszeile selbst das Schlüsselwort "abstract" hinzuzufügen, nicht nur die Eigenschaft. – Nick

+1

Dies wird nicht kompiliert. –

5

Sie benötigen AbstractClass generic

public class AbstractClass<T> { 
    ... 
} 

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

Yo machen u müssen die Art in der abstrakten Klasse angeben:

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

Sie müssen T definieren, wie so

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
  • Sie müssen den Typ T.
  • Sie das erklären müssen erklären Klasse AbstractClass als Zusammenfassung.
  • Sie müssen das Schlüsselwort override verwenden.

Versuchen Sie folgendes:

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 zum Kompilieren von Code – Tanzelax

3
  1. Sie benötigen Abstract abstract, markieren, weil es abstrakte Eigenschaft enthält

  2. Geben Sie den generischen Typ in der AbstractClass Erklärung

  3. Implementieren abstrakte Eigenschaft mit 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

Sie vermissen abstraktes Schlüsselwort für Ihre Abstract Klasse zu definieren und auch müssen Sie Schlüsselwort override für Container-Klasse Eigenschaft Items hinzuzufügen. Ich gebe den Beispielcode, der sicher läuft.

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