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?
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
- 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; }
}
You need to make AbstractClass
generic
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
You need to mark AbstractClass
abstract
, because it contains abstract propertySpecify the generic type in the
AbstractClass
declarationImplement 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; }
}
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; }
}
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; }
}
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();
}
}
}
精彩评论