24

我正在研究一个抽象类,其中实现类需要实现一个 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() 方法配合使用。我正在尝试做的事情如此独特吗?

4

7 回答 7

41

您还需要在类上声明,以了解类型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
于 2010-03-01T22:25:09.110 回答
10
  • 您需要声明类型 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; }
}
于 2010-03-01T22:28:35.373 回答
6

你需要AbstractClass通用

public class AbstractClass<T> {
  ...
}

public class Container : AbstractClass<Widgets> { ...
}
于 2010-03-01T22:25:27.440 回答
3
  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; }
}

于 2010-03-01T22:37:56.787 回答
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; }
}
于 2010-03-01T22:25:52.977 回答
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; }
}
于 2010-03-01T22:25:41.340 回答
0

您缺少为 AbstractClass 类定义抽象关键字,并且您需要为 Container Class Items 属性添加覆盖关键字。我给出的示例代码肯定会运行。

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();
    }
}
}
于 2018-01-11T09:29:15.200 回答