體驗C#範型,創建指定元素類型的ArrayList

體驗C#範型,創建指定元素類型的ArrayList
範型是一種重要的面向對象機制,瞭解C++的應該對他十分熟悉。簡單的說來,範型機制就是一種將類型延後到運行是確定的機制。比如你在定義一個類是,可以不指定某個字段或屬性的類型,而此類型將在類的實例聲明時被確定。在.net2005中,加入了對c#和vb.net的範型支持,爲開發帶來了很大的便利。
舉個例子:
1public class Info
2 {
3 private T info;
4 public Info(T ainfo)
5 {
6 this.info = ainfo;
7 }
8
9 public void ShowInfo()
10 {
11 Console.WriteLine(
12 this.info.ToString());
13 }
14 }class Program
{
static void Main(string[] args)
{
Info a = new Info(10);
Info day = new Info(DateTime.Now);
a.ShowInfo();
day.ShowInfo();
}
}
可以看見,類在定義時,成員info的類型用“T”代替,在對象聲明時,"T"的真正所指才被給出。

在..Net2005中,.類庫中加入了許多對範型的支持,在 System.Collections.Generic中,其中包括基於範型的SortedList,Queue,Stach等等,但是卻沒有我們平常使用最多的ArrayList,如果有這樣的東西,我們就能在建立ArrayList時指定元素的類型,而每次提取時就不用進行強制類型轉換了。有了這樣的想法,我們可以自己動手作一個。

首先現明確目標的功能:實現ArrayList中的插入、刪除,最重要的是:指定類型的元素的插入,和基於下標的元素的獲得。實現起來很簡單,只要使用一個對象適配器的模式。


1 public class ZLink:IEnumerable
2 {
3 private ArrayList list;
4 public int Count
5 {
6 get
7 {
8 return this.list.Count;
9 }
10 }
11 public ZLink()
12 {
13 this.list = new ArrayList();
14 }
15
16 public void Add(T item)
17 {
18 this.list.Add(item);
19 }
20
21 public T this[int i]
22 {
23 get
24 {
25 try
26 {
27 return (T)this.list[i];
28 }
29
30 catch (Exception ex)
31 {
32 throw ex;
33 }
34 }
35 }
36
37 public void Remove(T item)
38 {
39 this.list.Remove(item);
40 }
41
42 public void RemoveAt(int i)
43 {
44 try
45 {
46 this.list.RemoveAt(i);
47 }
48
49 catch (Exception ex)
50 {
51 throw ex;
52 }
53 }
54
55 public void Sort(IComparer ic)
56 {
57 this.list.Sort(ic);
58 }
59
60 public bool Contains(T item)
61 {
62 return this.list.Contains(item);
63 }
64
65 public void Clear()
66 {
67 this.list.Clear();
68 }
69
70
71 #region IEnumerable Members
72
73 public IEnumerator GetEnumerator()
74 {
75 foreach (object o in this.list)
76 {
77 yield return (T)o;
78 }
79 }
80
81 #endregion
82
83 #region IEnumerable Members
84
85 IEnumerator IEnumerable.GetEnumerator()
86 {
87 return this.GetEnumerator();
88 }
89
90 #endregion
91 }
其中的Add函數只能加入T類型的對象,而通過下標取得的元素也是T類型,另外還實現了在ArrayList中常用的Remove、Contains、Sort等方法。
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 ZLink patlabor = new ZLink();
6 patlabor.Add(new Man(21));
7 patlabor.Add(new Man(33));
8 patlabor.Add(new Man(28));
9
10 foreach (Man man in patlabor)
11 {
12 Console.WriteLine(man.ToString());
13 }
14 }
15 }
其中的"Man"可以是任何類型。代碼中與IEnumerat有關的東西,是爲了實現ZLink的foreach功能,這個以後再詳細說。


 


.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章