[英]Using generics in abstract classes
我正在研究一個抽象類,其中實現類需要實現 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 命令構建列表時,抽象類型 (ItemBase ) 不能很好地與 .ToList() 方法配合使用。 我正在嘗試做的事情很獨特嗎?
您還需要類的聲明,以了解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 override List<Widgets> Items { get; set; }
}
您還可以限制 T 可以是什么,比如說它必須實現IWidgets
:
public class AbstractClass<T> where T : IWidgets
嘗試這個:
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; }
}
您需要使AbstractClass
泛型
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
您需要標記 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; }
}
你需要像這樣定義 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; }
}
您需要在抽象類中指定類型:
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; }
}
您缺少為 AbstractClass 類定義抽象關鍵字,並且您還需要為容器類項屬性添加覆蓋關鍵字。 我給出了肯定會運行的示例代碼。
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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.