我正在开发一个抽象类,其中实现类需要实现T的列表。问题是这不起作用:
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; }
}
我确信有一个明显的答案我缺少,而且我知道我可以构建一个抽象基类型放入列表中,但是当我使用我的Linq命令来构建列表时,抽象type(ItemBase)与.ToList()方法不能很好地配合。我正试图做的那么独特吗?
答案 0 :(得分:31)
您还需要在课堂上声明,以了解T
的类型:
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; }
}
你也可以限制T可以,比如说它必须实现IWidgets
:
public class AbstractClass<T> where T : IWidgets
答案 1 :(得分:9)
试试这个:
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; }
}
答案 2 :(得分:5)
您需要AbstractClass
通用
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
答案 3 :(得分:3)
您需要标记AbstractClass abstract
,因为它包含抽象属性
在AbstractClass
声明
使用 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; }
}
答案 4 :(得分:2)
您需要像这样定义T
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; }
}
答案 5 :(得分:1)
您需要在抽象类中指定类型:
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; }
}
答案 6 :(得分:0)
您缺少为AbstractClass类定义abstract关键字,还需要为Container Class Items属性添加override关键字。我将提供将运行的示例代码。
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();
}
}
}