thaBadDawg
thaBadDawg

Reputation: 5230

Using generics in abstract classes

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?

Upvotes: 29

Views: 68121

Answers (7)

Nick Craver
Nick Craver

Reputation: 630637

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 override 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

Upvotes: 48

Humayoun Kabir
Humayoun Kabir

Reputation: 11

You are missing to define abstract keyword for your AbstractClass class and also you need to add override keyword for Container Class Items property. I am giving the example code which will run for sure.

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

Upvotes: 1

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

Upvotes: 3

Mark Byers
Mark Byers

Reputation: 839234

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

Upvotes: 11

JDMX
JDMX

Reputation: 1509

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

Upvotes: 2

Reed Copsey
Reed Copsey

Reputation: 564931

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

Upvotes: 1

JaredPar
JaredPar

Reputation: 755587

You need to make AbstractClass generic

public class AbstractClass<T> {
  ...
}

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

Upvotes: 6

Related Questions