這應該做的伎倆,但我強烈建議對組成,在這裏你將存儲重新設計內部列出
public class MyItemList : List<MyItem>
{
public MyItemList(){}
public MyItemList(IEnumerable<MyItem> sequence): base(sequence) {}
public MyItemList cutOff(int count)
{
MyItemList result = new MyItemList(this.GetRange(0, count));
this.RemoveRange(0, count);
return result;
}
}
也可以考慮建立開放式泛型類型列表的像MyList<T> : List<T>
或MyList<T> : List<T> where T : MyItem
使類的客戶端可以利用泛型的
編輯:好吧,我實現了通用版的List<T>
爲擴展方法,這將有助於你更一般的邏輯來解釋你的MyItemList類外
public static class ListExtensions
{
public static List<T> CutOff<T>(this List<T> list, int count)
{
var result = list.GetRange(0, count);
list.RemoveRange(0, count);
return result;
}
}
現在你可以
var list = new List<int> {1,2,3,4,5,6};
Console.WriteLine ("cutted items:");
Console.WriteLine (string.Join(Environment.NewLine, list.CutOff(2)));
Console.WriteLine ("items in list:");
Console.WriteLine (string.Join(Environment.NewLine, list));
打印:
cutted items:
1
2
items in list:
3
4
5
6
另注:
我建議這樣做
public class MyItemList<T> : IList<T> where T : MyItem
{
private List<T> list;
//here will be implementation of all methods required by IList
//that will simply delegate to list field
}
注意,如果MyItemList
所有的邏輯是通用的(可以應用於List<T>
,如Cutoff
方法),你可能不需要單獨的課程。此外where T : MyItem
是可選的,只有當你在MyItemList
您是否考慮過使用組合而不是繼承? –
伊利亞是對的;它可能會更好地執行'IList',然後在內部使用私有'List '作爲您的存儲。這樣,如果將來改變主意,您可以自由決定採用另一種實施策略。問自己一個'MyItemList' *是一種特殊的'List '*,還是它的作用就像是一個MyItems *列表。前者是類繼承,後者是接口實現。 –
我同意你兩個。另外,如果你只想添加一些額外的List函數,比如'CutOff',那麼你可以使用擴展方法並且堅持使用泛型類型,即'List' –
sambomartin