2010-03-01 16 views
19

que estoy trabajando en una clase abstracta, donde la clase que implementa necesita implementar una lista de T. El problema es que esto no funciona:Uso de los genéricos en clases abstractas

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

Estoy seguro de que hay una respuesta obvia que me falta, y sé que puedo construir un tipo base abstracto para poner en la lista, pero cuando uso mi comando Linq para compilar la lista, el tipo abstracto (ItemBase) no se reproduce muy bien con el método .ToList(). Es lo que estoy tratando de hacer tan único?

+0

Resulta que necesito aprender a investigar mejor. Disculpas a todas las respuestas que fueron las mismas que no obtuvieron la marca de verificación. Elegí la más alta por su integridad y el hecho de que era la mejor. – thaBadDawg

+0

¿Realmente desea que los "Artículos" sean abstractos? (es decir, para anular las propiedades get o set?) Si se extiende desde 'AbstractClass ' como la mayoría de la gente sugiere, 'Container.Items' será implícitamente una 'List ', y ni siquiera tendrá que anularla. – Tanzelax

+0

Quiero dejar la posibilidad de que los métodos getter y setter sean anulados más adelante. En teoría, no es necesario, pero en la práctica, tratar de deshacer ese desastre conduce a un mundo de dolor. – thaBadDawg

Respuesta

26

Usted necesita la declaración de la clase, así, saber qué tipo T es:

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

También puede restringir lo que T puede ser, como dicen que debe implementar IWidgets:

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

No olvide agregar la palabra clave 'abstracta' en la línea de declaración de clase, no solo la propiedad. – Nick

+1

Esto no se compila. –

5

Es necesario hacer AbstractClass genérica

public class AbstractClass<T> { 
    ... 
} 

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

Yo u necesidad de especificar el tipo de la clase abstracta:

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

es necesario definir T al igual que

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
  • Es necesario declarar el tipo T.
  • Es necesario declarar la clase AbstractClass como resumen.
  • Debe utilizar la palabra clave de anulación.

Prueba esto:

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 para compilar el código – Tanzelax

3
  1. necesite marcar AbstractClass abstract, ya que contiene propiedad abstracta

  2. Especifique el tipo genérico de en la declaración AbstractClass

  3. Implementar propiedad abstracta con 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

Te faltan para definir palabras clave abstracto para su clase AbstractClass y también es necesario agregar palabra clave override para la propiedad Items de contenedores de clase. Le doy el código de ejemplo que se ejecutará con seguridad.

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