程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 第一章 介紹集合,泛型和計時器類--04

第一章 介紹集合,泛型和計時器類--04

編輯:.NET實例教程
CollectionBase 類
.Net Framework類庫並不包含用於存儲數據的泛型集合類,但可以使用抽象類CollectionBase去創建您自己的集合類。CollectionBash類使得開發人員可以定制集合類。它實現了創建一個集合類所必須實現的接口:ICollection and IEnumerable,做為集合類的一部份,開發人員不得不去實現它們。
用ArrayLists實現集合類
這一節,我們將演示如何使用C#實現我們自己的集合類。這人幾個目的。首先,如果你不是很熟悉使用面向對象(OOP)的方式編程,這個程序將向您展示C#中簡單的OOP技術。我們也可以通過這一節來討論一些性能問題,從而引入C#中不同的數據結構進行討論。最後,我想你會象喜歡本書的其他程序一樣喜歡本節,因為使用代碼去重新實現已經存在的數據結構是一件非常有趣的事情。正如Don Knuth(譯者注:中文名:高德納(1938-)算法和程序設計技術的先驅者。經典著作《計算機程序設計藝術》更是被譽為算法中真正的聖經,像KMPLR(K)這樣令人不可思議的算法,在此書比比皆是。難怪連BillGates 都說:如果能做對書裡所有的習題,就直接來微軟上班吧!對於DonE.Knuth本人,一生中獲得的獎項和榮譽不計其數,包括圖靈獎,美國國家科學金獎,美國數學學會斯蒂爾將(AMS SteelPrize),以及發明先進技術榮獲的極受尊重的京都獎(KyotoPrize)等等)所說的,you haven’t really learned something well until you’ve taught it to a computer.(譯者著:這裡實在不懂如何翻譯,妄加推論,大意應該是:在沒有教會電腦如何使用它之前,都不能算真正地掌握了它。------用程序實現了它就代表著電腦會使用它了)

對於C#的教學來說,自己實現不同的數據結構比你日復一日地調用現成類庫能學到更多的關於數據結構的知識。
定義一個集合類
在C#中定義一個集合類的最簡單的方法是基於系統的System.Collections類庫裡的CollectionBash抽象類進行定義。這個類提供了一系列的抽象方法讓你去實現並創建自己的集合類。CollectionBase類本身在內部實現了一個數據結構:InnerList(一個ArrayList),可以把字作為你所實現的類的基礎。本節我們著眼於怎樣使用CollectionBase去創建一個集合類。
實現集合類
在集合類中應該創建包含了常用的跟底層數據結構類InnerList進行交互的方法。我們首先實現Add,Remove,Count和Clear方法。這些方法對於這個類來說是最基本的,盡管其它方法使得這個類更加有用。
讓我們開始實現Add方法。這個方法有一個Object類型的參數,它在集合中添加一個項。代碼如下:
public void Add(Object item)
{
       InnerList.Add(item);
}
ArrayList把數據存儲為object(Object數據類型),這也是為什麼我們把item聲明為一個Object類型的原因。你將在第2章學到更多的關於ArrayList的知識。
Remove方法也是同樣的道理:
public void Remove(Object item)
{
       InnerList.Remove(item);
}
下一個方法是Count。Count經常被做為屬性,但我寧願把它實現為方法。在祖先類CollectionBase中Count方法已經被實現,所以我們不得不使用new關鍵字去隱藏CollectionBase類中的Count方法:
public new int Count()
{
       return InnerList.Count;
}
Clear方法用於清除InnerList中的所有項目。在定義這個方法也也需要使用new關鍵字:
public new void Clear()
{
       InnerList.Clear();
}
在最初階段,這些已經足夠了。讓我們著眼於如何在程序中使用這個類,下面代碼包含了類的完整代碼:
using System;
using System.Collections;
public class Collection : CollectionBase10pt"><T>
{ //譯者注:並不存在CollectionBase<T>類,上面應該改為CollectionBase。
    public void Add(Object item)
    {
       InnerList.Add(item);
    }
    public void Remove(Object item)
    {
       InnerList.t; COLOR: midnightblue">Remove(item);
    }
    public new void Clear()
    {
       InnerList.Clear();
    }
    public new int Count()
    {
       return InnerList.Count;
    }
}
class chapter1
{
    static void Main()
    {
       Collection names = new Collection();
       names.Add("David");
       names.Add("Bernica");
       names.Add("Raymond");
       names.Add("Clayton");
       foreach (Object name in names)
           Console.WriteLine(name);
       Console.WriteLine("Number of names: " + names.Count());
 &nbsp;     names.Remove("Raymond");
       Console.WriteLine("Number of names: " + names.Count());
       names.Clear();
       Console.WriteLine("Number of names: " + names.Count());
    }


}
為了使得這個集合類更加有用,你可以實現其他幾個方法。在本章的練習中你將有機會實現這幾個方法。
泛型編程
OOP(面向對象)的問題之一是代碼膨脹問題,有一種類型的代碼膨脹是由於你考慮在方法中可以使用各種可能的數據類型做為參數而不得不重載一個或一系列方法。解決它的方法之一是使用一個可以接納所有數據類型的值,這個值只需要定義一次。這種技術叫泛型編程。
泛型在編譯時提供了一種叫占位符的數據類型,用於填充需要指定某種數據類型的地方。占位符為用中括號括住的一個標識符。讓我們看一個例子。
泛型編程的一個標准的例子是Swap方法。下面是C#中的Swap方法泛型版本的定義:
static void Swap<T>(ref T val1, ref T val2)
{
    T temp;
    temp = val1;
    val1 = val2;
    val2 = temp;

-SIZE: 10pt; COLOR: darkgreen">}
代表數據類型的占位符緊跟在方法名稱的後面。當任何時候需要使用一個泛型數據類型時,就可以使用中括號之間的標識符來代替。每個參數都被聲明為泛型類型,temp變量用於實現交換。下面是測試程序的代碼:
using System;
class chapter1
{
    static void Main()
    {
       int num1 = 100;
       int num2 = 200;
       Console.WriteLine("num1: " + num1);

le="FONT-SIZE: 10pt; COLOR: darkgreen">       Console.WriteLine("num2: " + num2);
       Swap<int>(ref num1, ref num2);
       Console.WriteLine("num1: " + num1);
       Console.WriteLine("num2: "

>+ num2);
       string str1 = "Sam";
       string str2 = "Tom";
       Console.WriteLine("String 1: " + str1);
       Console.WriteLine("String 2: " + str2);
       SwapCOLOR: darkgreen"><string>(ref str1, ref str2);
       Console.WriteLine("String 1: " + str1);
       Console.WriteLine("String 2: " + str2);
    }
    static void Swap<T>(ref t; COLOR: black">T val1, ref T val2)
    {
       T temp;
       temp = val1;
       val1 = val2;
       val2 = temp;
    }
}
運行結果為


 
泛型並非只能在方法中聲明,你也可以創建一個泛型類。聲明一個泛型類需要在類名後面包含泛型占位符。任何時候在程序中引用類名都必須包含占位符。下面代碼演示了如何創建一個泛型類:
public class Node<T> //譯者注:C#中的泛型鏈表的實現
{
    T data;
    Node<T> link;
    public Node(T data, Node<T> link)
    {
       <

/span>this.data = data;
       this.link = link;
    }
}
這個類的使用方法如下:
Node<string> node1 = new Node<string>("Mike", null);
Node<string> node2 = new NT-SIZE: 10pt; COLOR: black">Node<string>("Raymond", node1);
我們將在本書所討論的幾個數據結構中使用Node類。
使用泛型進行編程非常有用,C#已經提供了用泛型實現的數據結構的類庫。這些數據結構可以在System.Collection.Generics命名空間之下找到,並且當我們討論這個命名空間下的某個數據結構時,將會研究如何使用它。一般情況下,盡管這個類具有和非泛型數據結構類相同的功能,我們還是盡量使用泛型類做為實例,因為使用它們並沒有什麼區別。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved