views:

167

answers:

6

I'm working on an abstract class where the implementing class needs to implement a list of T. The problem is that this doesn't work:

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

I'm sure that there is an obvious answer that I'm missing, and I know that I can build an abstract base type to put in the list, but when I use my Linq command to build the list, the abstract type (ItemBase) doesn't play nicely with the .ToList() method. Is what I'm trying to do so unique?

+5  A: 

You need the declaration on the class as well, to know what type T is:

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

You can also restrict what T can be, like say it must implement IWidgets:

public class AbstractClass<T> where T : IWidgets
Nick Craver
Don't forget to add the `abstract` key word in the class declaration line itself, not just the property.
Nick
This doesn't compile.
Mark Byers
+3  A: 

You need to make AbstractClass generic

public class AbstractClass<T> {
  ...
}

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

You need to specify the type in the abstract class:

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

You need to define T like 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; }
}
JDMX
+2  A: 
  • You need to declare the type T.
  • You need to declare the class AbstractClass as abstract.
  • You need to use the override keyword.

Try this:

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; }
}
Mark Byers
+1 for compiling code
Tanzelax
+1  A: 
  1. You need to mark AbstractClass abstract, because it contains abstract property

  2. Specify the generic type in the AbstractClass declaration

  3. Implement abstract property with 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; }
}

Stanislav Basovník