代码之家  ›  专栏  ›  技术社区  ›  thaBadDawg

在抽象类中使用泛型

  •  20
  • thaBadDawg  · 技术社区  · 15 年前

    我正在处理一个抽象类,在这个抽象类中,实现类需要实现一个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)不能很好地与.to list()方法配合使用。我想做的是独一无二的吗?

    7 回复  |  直到 7 年前
        1
  •  31
  •   Nick Craver    15 年前

    您还需要在类上声明,以了解类型 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
    
        2
  •  9
  •   Mark Byers    15 年前
    • 您需要声明类型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; }
    }
    
        3
  •  5
  •   JaredPar    15 年前

    你需要做 AbstractClass 通用

    public class AbstractClass<T> {
      ...
    }
    
    public class Container : AbstractClass<Widgets> { ...
    }
    
        4
  •  3
  •   Stanislav Basovník    15 年前
    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; }
    }
    
    
        5
  •  2
  •   JDMX    15 年前

    你需要这样定义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; }
    }
    
        6
  •  1
  •   Reed Copsey    15 年前

    需要在抽象类中指定类型:

    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; }
    }
    
        7
  •  0
  •   Humayoun Kabir    7 年前

    缺少为AbstractClass类定义抽象关键字,还需要为容器类项属性添加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();
        }
    }
    }