




已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
.Net之美樣章 - 1.1 理解泛型(初稿)Word版本下載:.Net之美樣章 - 1.1 理解泛型范例代碼:點此下載 .Net 1.1版本最受詬病的一個缺陷就是沒有提供對泛型的支持。通過使用泛型,我們可以極大地提高代碼的重用度,同時還可以獲得強類型的支持,避免了隱式的裝箱、拆箱,在一定程度上提升了應用程序的性能。本文將系統(tǒng)地為大家討論泛型,我們先從理解泛型開始。1.1 理解泛型1.1.1 為什么要有泛型?我想不論大家通過什么方式進入了計算機程序設計這個行業(yè),都免不了要面對數(shù)據結構和算法這個話題。因為它是計算機科學的一門基礎學科,往往越是底層的部分,對于數(shù)據結構或者算法的時間效率和空間效率的要求就越高。比如說,當你在一個集合類型(例如ArrayList)的實例上調用Sort()方法對它進行排序時,.Net框架在底層就應用了快速排序算法。.Net框架中快速排序方法名稱叫QuickSort(),它位于Array類型中,這可以通過Reflector.exe工具查看到。我們現(xiàn)在并不是要討論這個QuickSort()實現(xiàn)的好不好,效率高還是不高,這偏離了我們的主題。但是我想請大家思考一個問題:如果由你來實現(xiàn)一個排序算法,你會怎么做?好吧,我們把題目限定得再窄一些,我們來實現(xiàn)一個最簡單的冒泡排序(Bubble Sort)算法,如果你沒有使用泛型的經驗,我猜測你可能會毫不猶豫地寫出下面的代碼來,因為這是大學教程的標準實現(xiàn):public class SortHelper public void BubbleSort(int array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj arrayj - 1 ) int temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; 對冒泡排序不熟悉的讀者,可以放心地忽略上面代碼的方法體,它不會對你理解泛型造成絲毫的障礙,你只要知道它所實現(xiàn)的功能就可以了:將一個數(shù)組的元素按照從小到大的順序重新排列。我們對這個程序進行一個小小的測試:class Program static void Main(string args) SortHelper sorter = new SortHelper(); int array = 8, 1, 4, 7, 3 ; sorter.BubbleSort(array); foreach(int i in array) Console.Write(0 , i); Console.WriteLine(); Console.ReadKey(); 輸出為:1 3 4 7 8我們發(fā)現(xiàn)它工作良好,欣喜地認為這便是最好的解決方案了。直到不久之后,我們需要對一個byte類型的數(shù)組進行排序,而我們上面的排序算法只能接受一個int類型的數(shù)組,盡管我們知道它們是完全兼容的,因為byte類型是int類型的一個子集,但C#是一個強類型的語言,我們無法在一個接受int數(shù)組類型的地方傳入一個byte數(shù)組。好吧,沒有關系,現(xiàn)在看來唯一的辦法就是將代碼復制一遍,然后將方法的簽名改一個改了:public class SortHelper public void BubbleSort(int array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj arrayj - 1) int temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; public void BubbleSort(byte array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj arrayj - 1) int temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; OK,我們再一次解決了問題,盡管總覺得哪里有點別扭,但是這段代碼已經能夠工作,按照敏捷軟件開發(fā)的思想,不要過早地進行抽象和應對變化,當變化第一次出現(xiàn)時,使用最快的方法解決它,當變化第二次出現(xiàn)時,再進行更好的構架和設計。這樣做的目的是為了避免過度設計,因為很有可能第二次變化永遠也不會出現(xiàn),而你卻花費了大量的時間精力制造了一個永遠也用不到的“完美設計”。這很像一個諺語,“fool me once,shame on you. fool me twice, shame on me.”,翻譯過來的意思是“愚弄我一次,是你壞;愚弄我兩次,是我蠢”。美好的事情總是很難長久,我們很快需要對一個char類型的數(shù)組進行排序,我們當然可以仿照byte類型數(shù)組的作法,繼續(xù)采用復制粘貼大法,然后修改一下方法的簽名。但是很遺憾,我們不想讓它愚弄我們兩次,因為誰也不想證明自己很蠢,所以現(xiàn)在是時候思考一個更佳的解決方案了。我們仔細地對比這兩個方法,會發(fā)現(xiàn)這兩個方法的實現(xiàn)完全一樣,除了方法的簽名不同以外,沒有任何的區(qū)別。如果你曾經開發(fā)過Web站點程序,會知道對于一些瀏覽量非常大的站點,為了避免服務器負擔過重,通常會采用靜態(tài)頁面生成的方式,因為使用Url重寫仍要要耗費大量的服務器資源,但是生成為html靜態(tài)網頁后,服務器僅僅是返回客戶端請求的文件,能夠極大的減輕服務器負擔。在Web上實現(xiàn)過靜態(tài)頁面生成時,有一種常用的方法,就是模板生成法,它的具體作法是:每次生成靜態(tài)頁面時,先加載模板,模板中含有一些用特殊字符標記的占位符,然后我們從數(shù)據庫讀取數(shù)據,使用讀出的數(shù)據將模板中的占位符替換掉,最后將模板按照一定的命名規(guī)則在服務器上保存成靜態(tài)的html文件。我們發(fā)現(xiàn)這里的情況是類似的,我來對它進行一個類比:我們將上面的方法體視為一個模板,將它的方法簽名視為一個占位符,因為它是一個占位符,所以它可以代表任何的類型,這和靜態(tài)頁面生成時模板的占位符可以用來代表來自數(shù)據庫中的任何數(shù)據道理是一樣的。接下來就是定義占位符了,我們再來審視一下這三個方法的簽名:public void BubbleSort(int array)public void BubbleSort(byte array)public void BubbleSort(char array)會發(fā)現(xiàn)定義占位符的最好方式就是將int、byte、char用占位符替代掉,我們管這個占位符用T來表示,其中T可以代表任何類型,這樣就屏蔽了三個方法簽名的差異:public void BubbleSort(T array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj arrayj - 1) T temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; 現(xiàn)在看起來清爽多了,但是我們又發(fā)現(xiàn)了一個問題:當我們定義一個類,而這個類需要引用它本身以外的其他類型時,我們可以定義有參數(shù)的構造函數(shù),然后將它需要的參數(shù)從構造函數(shù)傳進來。但是在上面,我們的參數(shù)T本身就是一個類型(類似于int、byte、char,而不是類型的實例,比如1和a)。很顯然我們無法在構造函數(shù)中傳遞這個T類型的數(shù)組,因為參數(shù)都是出現(xiàn)在類型實例的位置,而T是類型本身,它的位置不對。比如下面是通常的構造函數(shù):public SortHelper(類型 類型實例名稱);而我們期望的構造函數(shù)函數(shù)是:public SortHelper(類型);此時就需要使用一種特殊的語法來傳遞這個T占位符,不如我們定義這樣一種語法來傳遞吧:public class SortHelper public void BubbleSort(T array) / 方法實現(xiàn)體 我們在類名稱的后面加了一個尖括號,使用這個尖括號來傳遞我們的占位符,也就是類型參數(shù)。接下來,我們來看看如何來使用它,當我們需要為一個int類型的數(shù)組排序時:SortHelper sorter = new SortHelper();int array = 8, 1, 4, 7, 3 ;sorter.BubbleSort(array);當我們需要為一個byte類型的數(shù)組排序時:SortHelper sorter = new SortHelper();byte array = 8, 1, 4, 7, 3 ;sorter.BubbleSort(array);相信你已經發(fā)覺,其實上面所做的一切實現(xiàn)了一個泛型類。這是泛型的一個最典型的應用,可以看到,通過使用泛型,我們極大地減少了重復代碼,使我們的程序更加清爽,泛型類就類似于一個模板,可以在需要時為這個模板傳入任何我們需要的類型。我們現(xiàn)在更專業(yè)一些,為這一節(jié)的占位符起一個正式的名稱,在.Net中,它叫做類型參數(shù) (Type Parameter),下面一小節(jié),我們將學習類型參數(shù)約束。1.1.2 類型參數(shù)約束實際上,如果你運行一下上面的代碼就會發(fā)現(xiàn)它連編譯都通過不了,為什么呢?考慮這樣一個問題,假如我們自定義一個類型,它定義了書,名字叫做Book,它含有兩個字段:一個是int類型的Id,是書的標識符;一個是string類型的Title,代表書的標題。因為我們這里是一個范例,為了既能說明問題又不偏離主題,所以這個Book類型只含有這兩個字段:public class Book private int id; private string title; public Book() public Book(int id, string title) this.id = id; this.title = title; public int Id get return id; set id = value; public string Title get return title; set title = value; 現(xiàn)在,我們創(chuàng)建一個Book類型的數(shù)組,然后試著使用上一小節(jié)定義的泛型類來對它進行排序,我想代碼應該是這樣子的:Book bookArray = new Book2;Book book1 = new Book(124, .Net之美);Book book2 = new Book(45, C# 3.0揭秘);bookArray0 = book1;bookArray1 = book2;SortHelper sorter = new SortHelper();sorter.BubbleSort(bookArray);foreach (Book b in bookArray) Console.WriteLine(Id:0, b.Id); Console.WriteLine(Title:0n, b.Title);可能現(xiàn)在你還是沒有看到會有什么問題,你覺得上一節(jié)的代碼很通用,那么讓我們看得再仔細一點,再看一看SortHelper類的BubbleSort()方法的實現(xiàn)吧,為了避免你回頭再去翻上一節(jié)的代碼,我將它復制了下來:public void BubbleSort(T array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj arrayj - 1) T temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; 盡管我們很不情愿,但是問題還是出現(xiàn)了,既然是排序,那么就免不了要比較大小,大家可以看到在兩個元素進行交換時進行了大小的比較,那么現(xiàn)在請問:book1和book2誰比較大?小張可能說book1大,因為它的Id是124,而book2的Id是45;而小王可能說book2大,因為它的Title是以“C”開頭的,而book1的Title是以“.”開頭的(字符排序時“.”在“C”的前面)。但是程序就無法判斷了,它根本不知道要按照小張的標準進行比較還是按照小王的標準比較。這時候我們就需要定義一個規(guī)則進行比較。在.Net中,實現(xiàn)比較的基本方法是實現(xiàn)IComparable接口,它有泛型版本和非泛型兩個版本,因為我們現(xiàn)在正在講解泛型,而可能你還沒有領悟泛型,為了避免你的思維發(fā)生“死鎖”,所以我們采用它的非泛型版本。它的定義如下:public interface IComparable int CompareTo(object obj);假如我們的Book類型已經實現(xiàn)了這個接口,那么當向下面這樣調用時:book1.CompareTo(book2);如果book1比book2小,返回一個小于0的整數(shù);如果book1與book2相等,返回0;如果book1比book2大,返回一個大于0的整數(shù)。接下來就讓我們的Book類來實現(xiàn)IComparable接口,此時我們又面對排序標準的問題,說通俗點,就是用小張的標準還是小王的標準,這里就讓我們采用小張的標準,以Id為標準對Book進行排序,修改Book類,讓它實現(xiàn)IComparable接口:public class Book :IComparable / CODE:上面的實現(xiàn)略 public int CompareTo(object obj) Book book2 = (Book)obj; return this.Id.CompareTo(book2.Id); 為了節(jié)約篇幅,我省略了Book類上面的實現(xiàn)。還要注意的是我們并沒有在CompareTo()方法中去比較當前的Book實例的Id與傳遞進來的Book實例的Id,而是將對它們的比較委托給了int類型,因為int類型也實現(xiàn)了IComparable接口。順便一提,大家有沒有發(fā)現(xiàn)上面的代碼存在一個問題?因為這個CompareTo ()方法是一個很“通用”的方法,為了保證所有的類型都能使用這個接口,所以它的參數(shù)接受了一個Object類型的參數(shù)。因此,為了獲得Book類型,我們需要在方法中進行一個向下的強制轉換。如果你熟悉面向對象編程,那么你應該想到這里違反了Liskov替換原則,關于這個原則我這里無法進行專門的講述,只能提一下:這個原則要求方法內部不應該對方法所接受的參數(shù)進行向下的強制轉換。為什么呢?我們定義繼承體系的目的就是為了代碼通用,讓基類實現(xiàn)通用的職責,而讓子類實現(xiàn)其本身的職責,當你定義了一個接受基類的方法時,設計本身是優(yōu)良的,但是當你在方法內部進行強制轉換時,就破壞了這個繼承體系,因為盡管方法的簽名是面向接口編程,方法的內部還是面向實現(xiàn)編程。注釋:什么是“向下的強制轉換(downcast)”?因為Object是所有類型的基類,Book類繼承自Object類,在這個金字塔狀的繼承體系中,Object位于上層,Book位于下層,所以叫“向下的強制轉換”。好了,我們現(xiàn)在回到正題,既然我們現(xiàn)在已經讓Book類實現(xiàn)了IComparable接口,那么我們的泛型類應該可以工作了吧?不行的,因為我們要記得:泛型類是一個模板類,它對于在執(zhí)行時傳遞的類型參數(shù)是一無所知的,也不會做任何猜測,我們知道Book類現(xiàn)在實現(xiàn)了IComparable,對它進行比較很容易,但是我們的SortHelper泛型類并不知道,怎么辦呢?我們需要告訴SortHelper類(準確說是告訴編譯器),它所接受的T類型參數(shù)必須能夠進行比較,換言之,就是實現(xiàn)IComparable接口,這便是本小節(jié)的主題:泛型約束。為了要求類型參數(shù)T必須實現(xiàn)IComparable接口,我們像下面這樣重新定義SortHelper:public class SortHelper where T:IComparable / CODE:實現(xiàn)略上面的定義說明了類型參數(shù)T必須實現(xiàn)IComaprable接口,否則將無法通過編譯,從而保證了方法體可以正確地運行。因為現(xiàn)在T已經實現(xiàn)了IComparable,而數(shù)組array中的成員是T的實例,所以當你在arrayi后面點擊小數(shù)點“.”時,VS200智能提示將會給出IComparable的成員,也就是CompareTo()方法。我們修改BubbleSort()類,讓它使用CompareTo()方法來進行比較:public class SortHelper where T:IComparable public void BubbleSort(T array) int length = array.Length; for (int i = 0; i = 1; j-) / 對兩個元素進行交換 if (arrayj.CompareTo(arrayj - 1) 0 ) T temp = arrayj; arrayj = arrayj - 1; arrayj - 1 = temp; 此時我們再次運行上面定義的代碼,會看到下面的輸出:Id:45Title:.Net之美Id:124Title:C# 3.0揭秘除了可以約束類型參數(shù)T實現(xiàn)某個接口以外,還可以約束T是一個結構、T是一個類、T擁有構造函數(shù)、T繼承自某個基類等,但我覺得將這些每一種用法都向你羅列一遍無異于浪費你的時間。所以我不在這里繼續(xù)討論了,它們的概念是完全一樣的,只是聲明的語法有些差異罷了,而這點差異,相信你可以很輕松地通過查看MSDN解決。1.1.3 泛型方法我們再來考慮這樣一個問題:假如我們有一個很復雜的類,它執(zhí)行多種基于某一領域的科學運算,我們管這個類叫做SuperCalculator,它的定義如下:public class SuperCalculator public int SuperAdd(int x, int y) return 0; public int SuperMinus(int x, int y) return 0; public string SuperSearch(string key) return null; public void SuperSort(int array) 由于這個類對算法的要求非常高,.Net框架內置的快速排序算法不能滿足要求,所以我們考慮自己實現(xiàn)一個自己的排序算法,注意到SuperSearch()和SuperSort()方法接受的參數(shù)類型不同,所以我們最好定義一個泛型來解決,我們將這個算法叫做SpeedSort(),既然這個算法如此之高效,我們不如把它定義為public的,以便其他類型可以使用,那么按照前面兩節(jié)學習的知識,代碼可能類似于下面這樣:public class SuperCalculator where T:IComparable / CODE:略 public void SpeedSort(T array) / CODE:實現(xiàn)略 這里穿插講述一個關于類型設計的問題:確切的說,將SpeedSort()方法放在SuperCaculator中是不合適的。為什么呢?因為它們的職責混淆了,SuperCaculator的意思是“超級計算器”,那么它所包含的公開方法都應該是與計算相關的,而SpeedSort()出現(xiàn)在這里顯得不倫不類,當我們發(fā)現(xiàn)一個方法的名稱與類的名稱關系不大時,就應該考慮將這個方法抽象出去,把它放置到一個新的類中,哪怕這個類只有它一個方法。這里只是一個演示,我們知道存在這個問題就可以了。好了,我們回到正題,盡管現(xiàn)在SuperCalculator類確實可以完成我們需要的工作,但是它的使用卻變得復雜了,為什么呢?因為SpeedSort()方法污染了它,僅僅為了能夠使用SpeedSort()這一個方法,我們卻不得不將類型參數(shù)T加到SuperCalculator類上,使得即使不調用SpeedSort()方法時,創(chuàng)建SuperCalculator實例時也得接受一個類型參數(shù)。為了解決這個問題,我們自然而然地會想到:有沒有辦法把類型參數(shù)T加到方法上,而非整個類上,也就是降低T作用的范圍。答案是可以的,這便是本小節(jié)的主題:泛型方法。類似地,我們只要修改一下SpeedSort()方法的簽名就可以了,讓它接受一個類型參數(shù),此時SuperCalculator的定義如下:public class SuperCalculator / CODE:其他實現(xiàn)略 public void SpeedSort(T array) where T : IComparable / CODE:實現(xiàn)略 接下來我們編寫一段代碼來對它進行一個測試:Book bookArray = new Book2;Book book1 = new Book(124, C# 3.0揭秘);Book book2 = new Book(45, .Net之美);SuperCalculator calculator = new SuperCalculator();calculator.SpeedSort(bookArray);因為SpeedSort()方法并沒有實現(xiàn),所以這段代碼沒有任何輸出,如果你想看到輸出,可以簡單地把上面冒泡排序的代碼貼進去,這里我就不再演示了。這里我想說的是一個有趣的編譯器能力,它可以推斷出你傳遞的數(shù)組類型以及它是否滿足了泛型約束,所以,上面的SpeedSort()方法也可以像下面這樣調用:calculator.SpeedSort(bookArray);這樣盡管它是一個泛型方法,但是在使用上與普通方法已經沒有了任何區(qū)別。1.1.4 總結本節(jié)中我們學習了掌握泛型所需要的最基本知識,你看到了需要泛型的原因,它可以避免重復代碼,還學習到了如何使用類型參數(shù)約束和泛型方法。擁有了本節(jié)的知識,你足以應付日常開發(fā)中的大部分場景。在下面兩節(jié),我們將繼續(xù)泛型的學習,其中包括泛型在集合類中的應用,以及泛型的高級話題。0 0 0 (請您對文章做出評價) 上一篇:Asp.Net 用戶驗證(自定義IPrincipal和IIdentity) 下一篇:.Net之美樣章 - 2.C#中的委托和事件(初稿)posted 2008-12-17 13:15 Jimmy Zhang 閱讀(6289) 評論(81) 編輯 收藏 網摘 所屬分類: 2. C# 編程發(fā)表評論1672551回復引用 #1樓2008-12-17 13:25 | astarnologin未注冊用戶 介意寫.net重要技術的書,類似于園子里的專題。把做中大型網站需要用到的技術,如URL重寫,生成靜態(tài)頁,性能方面,壓力測試等?;貜鸵貌榭?#2樓樓主2008-12-17 13:26 | Jimmy Zhang astarnologin 謝謝 你提到的技術我會挑一些寫的。 回復引用查看 #3樓2008-12-17 13:42 | GUO Xingwang 張子陽的文章寫得就是好,講得很明白,條理清晰,引導性很強,不錯,以前讀過你的文章!受益很多回復引用 #4樓2008-12-17 13:49 | elwin未注冊用戶 同意樓上的。博主能否提供一下書目?回復引用查看 #5樓樓主2008-12-17 13:51 | Jimmy Zhang elwin 書目有的,.Net之美詳細目錄(暫定): /download/catalog.doc 回復引用查看 #6樓2008-12-17 13:55 | Allie 呵呵 我也看過博主的文章很不錯呢 以后再看 最近木撒時間回復引用查看 #7樓2008-12-17 14:06 | jowo 凡你的文章都看,呵呵,加油回復引用 #8樓2008-12-17 14:07 | SystemCat未注冊用戶 博主想通過這本書告訴大家什么呢? 一本書沒有中心,就會流于平庸。 回復引用查看 #9樓樓主2008-12-17 14:07 | Jimmy Zhang Allie jowo 衷心感謝大家的支持!回復引用查看 #10樓2008-12-17 14:07 | jowo 樓主的文筆的確很不錯,該向你學習回復引用查看 #11樓樓主2008-12-17 14:08 | Jimmy Zhang SystemCat 謝謝建議,我會把握好這個尺度的,我想做的就是將我所掌握的,并且認為比較重要的內容以一種通俗易懂的方式介紹給大家。 回復引用查看 #12樓2008-12-17 14:31 | T2噬菌體 不錯!加油!回復引用查看 #13樓樓主2008-12-17 14:34 | Jimmy Zhang T2噬菌體 謝謝!回復引用查看 #14樓2008-12-17 15:39 | 張蒙蒙 樓主我馬上發(fā)布信息給你做廣告哦回復引用查看 #15樓樓主2008-12-17 15:41 | Jimmy Zhang 張蒙蒙 謝謝啦,現(xiàn)在宣傳有點早啊,壓力大,等我下一篇樣章出來了再做吧 :-)回復引用查看 #16樓2008-12-17 15:44 | 上不了岸的魚ttzhang 樓主的文章寫的真是漂亮,學習! 期待樓主的新書! 一點建議: 書中的內容不一定是入門的,也不一定就是高深的,我最希望看到的是實用的,不能為了寫書而寫書?;貜鸵貌榭?#17樓2008-12-17 15:45 | 張蒙蒙 哈哈,你看看我的文章就知道怎么宣傳你的啦,博客園首頁,嘿嘿回復引用查看 #18樓樓主2008-12-17 15:48 | Jimmy Zhang 上不了岸的魚ttzhang 謝謝,這個道理我明白的,太深入的就偏理論而遠應用了?;貜鸵貌榭?#19樓樓主2008-12-17 15:49 | Jimmy Zhang 張蒙蒙 呵呵,看到了,看來 C#中的委托和事件 這篇文章流傳甚廣啊 :-)回復引用查看 #20樓2008-12-17 16:10 | Artech 范型帶給我們最大的好處就是“算法的復用”,通過范型類型創(chuàng)建與具體類型無關的算法,使之適合所有的類型?;貜鸵貌榭?#21樓樓主2008-12-17 16:14 | Jimmy Zhang Artech 不夠全面,泛型的另一大好處是提供強類型支持,這樣可以避免隱式的裝箱、拆箱,尤其在集合類中,使用泛型可以極大地提高應用程序的性能?;貜鸵貌榭?#22樓2008-12-17 16:35 | 李永京 恩,好,通俗易懂回復引用 #23樓2008-12-17 16:53 | 老破未注冊用戶 已經跑到深圳啦?!動作蠻快的?;貜鸵?#24樓2008-12-17 16:54 | jing2008未注冊用戶 期待新書,加油呀!(*_*) 回復引用查看 #25樓樓主2008-12-17 16:54 | Jimmy Zhang 老破 是?。∪ド钲诎l(fā)展發(fā)展回復引用查看 #26樓樓主2008-12-17 16:55 | Jimmy Zhang jing2008 謝謝!回復引用查看 #27樓2008-12-17 17:23 | Anytao Artech Jimmy Zhang 算法復用是其精神,強類型支持是效果,把握精髓,兼顧效果:-)回復引用查看 #28樓2008-12-17 17:24 | Anytao 對了,名字很好.NET之美,希望寫得更美:-)回復引用查看 #29樓樓主2008-12-17 17:35 | Jimmy Zhang Anytao 謝謝啦 因為這本書橫跨度太大,所以叫深入淺出不合適,就決定改名了 至于更美么,我只能盡力而為了,但是我至少讓大家看得時候不覺得太無聊?;貜鸵貌榭?#30樓2008-12-17 17:38 | SOSOSs BLog 強烈建議把demo附上來!回復引用查看 #31樓樓主2008-12-17 17:48 | Jimmy Zhang SOSOSs BLog 不好意思,現(xiàn)在已經附上去了?;貜鸵?#32樓2008-12-17 18:26 | hahahehe未注冊用戶 /gjcn/archive/2008/11/25/1338407.html 樓主寫的很好啊,可以參考一下上面這篇就更好了?;貜鸵貌榭?#33樓樓主2008-12-17 18:29 | Jimmy Zhang hahahehe 這只是泛型的1個小節(jié)而已,更深入的內容會在后面闡述,但還是謝謝你提供的鏈接?;貜鸵貌榭?#34樓2008-12-17 20:04 | Selfocus 看了一下書目,不錯,期待ing.回復引用 #35樓2008-12-17 20:35 | uvw 45未注冊用戶 小小地測試 有沒有錯別字? 當我們定義一個類,而這個類需要引用它本身以外的其他類型時,我們可以定義有參數(shù)的構造函數(shù),然后將它需要的參數(shù)從構造函數(shù)傳進來。但是在上面,我們的參數(shù)T本身就是一個類型(類似于int、byte、char,而不是類型的實例,比如1和a)。很顯然我們無法在構造函數(shù)中傳遞這個T類型的數(shù)組,因為參數(shù)都是出現(xiàn)在類型實例的位置,而T是類型本身,它的位置不對。 這個沒什么說服力,扯不到一起 NOTE:什么是“向下的強制轉換(downcast)”? NOTE是英文書才用的吧,換中文回復引用查看 #36樓樓主2008-12-17 20:42 | Jimmy Zhang uvw 45 謝謝指正,這個是編輯尚未審核的初稿,將來可能還會有較大改動。回復引用查看 #37樓2008-12-17 21:18 | 要有好的心情 支持樓主出書回復引用查看 #38樓樓主2008-12-17 21:32 | Jimmy Zhang 要有好的心情 謝謝支持!回復引用查看 #39樓2008-12-17 22:12 | 飛林沙 個人建議: 很多技術內容很多人都已經寫過了,比如泛型,看過博主的很多文章,十分佩服。 但是希望新書應該不能走一條老路,也就是說把別人都寫過很多次的東西再拿出來重寫一次,這樣很多讀者都會略讀掉很多文章。 所以希望博主可以寫一些他人沒有涉及或者涉及很少的部分?;貜鸵貌榭?#40樓樓主2008-12-17 22:17 | Jimmy Zhang 飛林沙 呵呵,謝謝建議,這本書不會只是就技術論技術,我會在寫作中穿插一些設計思想和模式,比如在這篇中,我就插入了三個面向對象方面的知識,不知道你看出來了么? 1、敏捷軟件開發(fā)的一個思想:應對第2次變化。 2、Liskov替換原則 3、方法的職責必須與類名稱聯(lián)系緊密?;貜鸵貌榭?#41樓2008-12-17 22:25 | 飛林沙 Jimmy Zhang 哈!雖然從頭看到了尾,不過還是真沒太注意到。 如果是這樣的話,還是顯式地給提出來比較好!這樣對讀者幫助比較大回復引用查看 #42樓2008-12-17 22:30 | canbeing 真的寫得好棒思路非常清晰期待你的書回復引用查看 #43樓樓主2008-12-17 22:35 | Jimmy Zhang canbeing 謝謝鼓勵,書預計要到2009年底甚至2010年初才能出版?;貜鸵貌榭?#44樓樓主2008-12-17 22:41 | Jimmy Zhang 飛林沙 我是直接提出來了啊,只是沒有用太大的篇幅去描述,因為這樣容易跑題。回復引用查看 #45樓樓主2008-12-17 22:51 | Jimmy Zhang 王孟軍! 所有能比較大小的類型,如果是.NET框架中的類型,全部都實現(xiàn)了IComparable,你可以在類型上點擊鍵盤上的“F12”查看一下,當你自定義一個類型時,如果你要比較大小,就需要實現(xiàn)它,或者實現(xiàn)一個和它類似功能的接口。 更具體的你可以參看我博客“基于業(yè)務對象的排序”這篇文章?;貜鸵貌榭?#46樓樓主2008-12-17 22:53 | Jimmy Zhang 王孟軍! 這里的“死鎖”是個比喻,就是說繞進去出不來了,因為我現(xiàn)在在講泛型,你可能泛型還沒有理解,然后就引入一個泛型的接口,怕把你搞暈,所以使用非泛型版本。 回復引用查看 #47樓2008-12-17 23:08 | 王孟軍! Jimmy Zhang明白了,謝謝這里的死鎖 是 思維 死鎖的意思,呵呵回復引用 #48樓2008-12-18 00:59 | faint_路漫漫未注冊用戶 太棒了 ,張老師,最近發(fā)現(xiàn)您的博客,如獲至寶啊會認真的學習的 謝謝回復引用 #49樓2008-12-18 01:13 | KKKLLLLL未注冊用戶 看了N諞泛型的文章.這篇總算弄懂了點.回復引用查看 #50樓樓主2008-12-18 05:42 | Jimmy Zhang faint_路漫漫 KKKLLLLL 謝謝鼓勵回復引用 #51樓2008-12-18 06:00 | vivianlou未注冊用戶 期待這本書的出版回復引用查看 #52樓2008-12-18 09:59 | vento 支持下,lz的文章的確寫得容易理解回復引用查看 #53樓樓主2008-12-18 10:02 | Jimmy Zhang vivianlou vento 謝謝支持回復引用查看 #54樓2008-12-18 10:41 | 貓小星 收藏!嘿嘿,我還沒學過數(shù)據結構。哈哈!不過冒泡等,還是懂得。要學的東西太多了,排不過來?;貜鸵貌榭?#55樓2008-12-18 10:56 | 向日葵 支持?;貜鸵?#56樓2008-12-18 11:35 | ucetggg未注冊用戶 以為書08年底 就可以看到呢 要拖到10年了 那 建議直接一篇一篇發(fā)到網上得了 別出書了 回復引用 #57樓2008-12-18 11:36 | ucetggg未注冊用戶 -引用- Jimmy Zhang: canbeing 謝謝鼓勵,書
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年脈沖反應堆及配套產品合作協(xié)議書
- 化妝品檢測服務合同范本
- 北美買車合同范本
- 低價格回收合同范本
- 個人酒店租房合同范本
- 出口蔬菜供應合同范本
- 合同范本寫才有效
- 單位購銷合同范本
- 電商直播主播簽約合作合同范本
- 洗車店轉讓合同范本
- 禮儀與教化 課件-2023-2024學年高中美術湘美版(2019)美術鑒賞
- 新生兒早期基本保健課件
- 采礦學課程設計硯北煤礦新井設計全套圖紙
- 第19章-城市設計課件
- 人事管理管理制度
- 大型儲罐計算書
- 2022-2023學年廣東省廣州市荔灣區(qū)統(tǒng)考初三第一次??紨?shù)學試題含解析
- 針對本項目售后服務方案
- 2022年桂林電子科技大學高等學歷繼續(xù)教育學士學位英語考試真
- 新人教版七至九年級英語單詞表 漢譯英(含音標)
- 新固廢法課件PPT
評論
0/150
提交評論