2016-02-01 45 views
2

我正在嘗試編寫一個基本的抽象類,其中擴展它的任何類將具有某種類型的List如何在抽象類中聲明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; } 
} 
+2

看起來你需要讓你的抽象類通用。 – juharr

回答

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

這是完美的。我之前嘗試過這個,並且錯過了'override'關鍵字。 –

1

您可以使用仿製藥,如:

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

    } 
1

除了包含重寫的答案之外,我將嘗試展示稍微不同的方法,這可能會拓寬視野。如果你會改變你的抽象類的實現,你甚至都不需要重寫你的收藏,除非你需要明確的實施get;或因爲你指定通用通過繼承本身

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

哇......這是不同的。我要試試這個。這很有意義,因爲它只是一個列表。 –