【问题标题】:How to declare List variable in abstract class如何在抽象类中声明 List 变量
【发布时间】:2016-05-10 12:52:37
【问题描述】:

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

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

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; }
}

【问题讨论】:

  • 看起来你需要让你的抽象类通用。

标签: c# pagination


【解决方案1】:

你可以用泛型做到这一点

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; }
}

【讨论】:

  • 这是完美的。我之前尝试过这个并错过了override关键字。
【解决方案2】:

你可以使用泛型,例如:

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
}

【讨论】:

    【解决方案3】:
           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; }
    
        }
    

    【讨论】:

      【解决方案4】:

      除了包含覆盖的答案之外,我将尝试展示可能会拓宽视野的稍微不同的方法。如果您要更改抽象类实现,您甚至不需要覆盖您的 Collection,除非您需要显式实现 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>
              }
          }
      }
      

      这个也可能对你有用:Generic Type in constructor 通过这种方法,您最终会得到一个基类,它将为您提供通用列表

      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;
          } 
      }
      

      【讨论】:

      • 哇...这是不同的。我要试试这个。这是有道理的,因为它只是每种情况下的一个列表。
      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 2014-02-26
      • 2016-05-10
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多