簡體   English   中英

在抽象類中使用泛型

[英]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
  • 您需要聲明類型 T。
  • 您需要將 AbstractClass 類聲明為抽象類。
  • 您需要使用 override 關鍵字。

嘗試這個:

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> { ...
}
  1. 您需要標記 AbstractClass abstract ,因為它包含抽象屬性

  2. AbstractClass聲明中指定泛型類型

  3. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM