如何在抽象类中声明列表变量

本文关键字:声明 列表 变量 抽象类 | 更新日期: 2023-09-27 18:32:52

我正在尝试编写一个基本的抽象类,其中任何扩展它的类都将具有某种类型的List

上下文是我调用一个 Web 服务,我收到订单的"页面",每个订单都有订单行的"页面"等。

abstract class Pagination
{
    public int _offset { get; set; }
    public int _total { get; set; }
    public string previous { get; set; }
    public string next { get; set; }
    // Can I add something here that represents a list of items
    // that is overridden in child classes somehow?
    // public abstract List<Something?> items { get; set; }
    // The purpose is for this generic "getItemCount" function or something similar
    /*
    public int getItemCount()
    {
        return items != null ? items.Count() : 0;
    }
    */
}
class OrderHeader : Pagination
{
    public int orderId { get; set; }
    public List<OrderLine> items { get; set; }
}
class OrderLine : Pagination
{
    public string sku { get; set; }
    public int qty { get; set; }
    public List<OrderLineDetails> items { get; set; }
}
class OrderLineDetails
{
    public string serialNum { get; set; }
}

如何在抽象类中声明列表变量

你可以用泛型来做到这一点

public abstract class Pagination<T>
{
    public abstract List<T> Items { get; set; }
}
public class OrderHeader : Pagination<OrderLine>
{
    public override List<OrderLine> Items { get; set; }
}
public class OrderLine : Pagination<OrderLineDetails>
{
    public override List<OrderLineDetails> Items { get; set; }
}

您可以使用泛型,例如:

abstract class Pagination<T>
{
    // Other properties
    public List<T> items { get; set; }
}
class OrderHeader : Pagination<OrderLine>
{
    // Other properties
}
class OrderLine : Pagination<OrderLineDetails>
{
    // Other properties
}
class OrderLineDetails
{
    // Other properties
}

除了包含覆盖的答案之外,我将尝试展示略有不同的方法,这可能会拓宽视野。如果要更改抽象类实现,则甚至不需要重写集合,除非需要显式实现get;set;,因为通过继承本身指定泛型

abstract class Pagination<T>
{
    public virtual List<T> Items { get; set; }
}
class Tester : Pagination<string>
{
    public void Test()
    {
        foreach (string item in this.Items)
        {
            // you have declared List<string> from Pagination<T>
        }
    }
}

这也可能对你有用:构造函数中的泛型类型通过这种方法,您最终会得到一个基类,该基类将为您提供通用列表

abstract class Pagination2<T>
{
    public string Property1 { get; set; }
    public List<T> Items { get; set; }
    public static Pagination2<T> GetInstance<T>()
    {
        Pagination2<T> instance = new Pagination2<T>()
        {
            Items = new List<T>()
        };
        return instance;
    } 
}
       abstract class Pagination<T>
    {
        public int _offset { get; set; }
        public int _total { get; set; }
        public string previous { get; set; }
        public string next { get; set; }
public List<T> items { get; set; }
        public int getItemCount()
        {
            return items != null ? items.Count() : 0;
        }
    }
    class OrderHeader : Pagination<OrderLine>
    {
        public int orderId { get; set; }
    }
    class OrderLine : Pagination<OrderLineDetails>
    {
        public string sku { get; set; }
        public int qty { get; set; }
    }