在抽象类中使用泛型

时间:2010-03-01 22:22:42

标签: c# generics abstraction

我正在开发一个抽象类,其中实现类需要实现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()方法不能很好地配合。我正试图做的那么独特吗?

7 个答案:

答案 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)

  • 您需要声明类型T。
  • 您需要将AbstractClass类声明为abstract。
  • 您需要使用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; }
}

答案 2 :(得分:5)

您需要AbstractClass通用

public class AbstractClass<T> {
  ...
}

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

答案 3 :(得分:3)

  1. 您需要标记AbstractClass abstract ,因为它包含抽象属性

  2. AbstractClass声明

  3. 中指定泛型类型
  4. 使用 override

  5. 实施抽象属性
    
    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();
    }
}
}