在實際的項目中,我們經常看到有人寫了很多代碼,抽象了很多類,而這些類無不是採用了泛型和委託,應用了這輛種技術後,經常有人給我們說,代碼的複用性和耦合性就降低了,那作為一個合格的物件導向的程式設計人員,這種技術成為了我們的必備技能,今天就跟著我一起來一次輕鬆愉快的旅行!
定義(如果吃力,請直接看我對他的註解):
泛型是程式設計語言的一種特性。允許程式員在強型別程式設計語言中編寫代碼時定 義一些可變部分,那些部分在使用前必須作出指明。各種程式設計語言和其編譯器、運行環境對泛型的支援均不一樣。將型別參數化以達到代碼複用提高軟體開發工作效率的一種資料類型。泛型類是參考型別,是堆對象,主要是引入了型別參數這個概念。
註解:
泛型就是一個黑盒子,我們設計代碼的時候不需要知道黑子裡是什麼類型,我們關心的是對黑盒子的處理,這樣,我們就不是針對具體的對象編程,我們就相當於定義了一套邏輯(執行標準),而我們在真正用的時候,給的是什麼類型,他就具有了這個邏輯(執行標準)!
生活舉例:
在我們的生活中,泛型的例子其實已經伴隨了我們很久,就是快遞,我們想想,快遞公司關心的重點是什嗎?不是我們要郵寄什麼東西,而是他怎麼選擇路徑,並盡最大的努力節省成本,所以他們定義自己快遞活動的時候,就將所有的快遞件當成黑箱子處理看,他做規劃,是北京到四川,火車怎麼走,那條路線,輪船怎麼走,那條路線,運送到哪個快遞員手裡最節省成本,這樣定義的好處是我們用10元人民幣,就像一件重量合適的物品從北京運送到了廣東(我們這邊的物價,地界不同可能會有出入)
我們看看這幅圖再理解一下:
是不是覺得,有那麼點眉頭了呢!但是還是落不到實處,因為我們是程式猿,我們習慣用代碼交流,基於此,我做了一個c#裡的小例子,僅供大家參考批評:
執行個體:背景:
快遞公司要對快遞包裹這個類進行封裝,且大包裹裡可以放N多小包裹,在運送之前要將包裹打包
類說明:
bagList~~~大包裹,可以包含小包裹
bag~~~~~~包裹類,有具體的物品
包裹代碼:
<span style="font-size:18px;">//一個快遞包裹倉庫 public class bagList<T> { //包裹類 private class bag { //執行個體包裹裡的物品 public bag(T t) { Something = t; } //收件者地址 private string address; public string Address { get { return address; } set { address = value; } } //收件者郵寄物品 private T something; public T Something { get { return something; } set { something = value; } } //下一個包裹 private bag next; public bag Next { get { return next; } set { next = value; } } } //一次快遞的包裹集合-倉庫 private bag head; //初識化這個快遞包裹倉庫 public bagList() { head = null; } //增加一個包裹到倉庫 public void AddHead(T t) { //執行個體一個包裹 bag Cbag = new bag(t); //新包裹裝到倉庫中 Cbag.Next= head; //倉庫的大門給快遞員 head = Cbag; } //取出倉庫中所有的包裹 //foreach語句必須實現的方法 public IEnumerator<T> GetEnumerator() { //執行個體一個包裹倉庫 bag baglist = head; //逐次取出所有的包裹 while (baglist != null) { //轉換為迭代器類型——為了將結果逐次輸出 yield return baglist.Something; //轉換為下一步要輸出的對象 baglist = baglist.Next; } } }</span>
用戶端代碼(快遞員):
<span style="font-size:18px;"> class Program { static void Main(string[] args) { //執行個體一個大包裹可以裝快遞員收到的包裹 bagList<int> baglist = new bagList<int>(); //裝0-9個物品到大包裹裡 for (int bag = 0; bag < 10; bag++) { baglist.AddHead(bag); } //將0-9個物品顯示出來 foreach (int i in baglist) { System.Console.WriteLine(i + "包裹已經入庫!"); } //所有包裹打包結束 System.Console.WriteLine("快遞包裹打包完成"); } }</span>
運行結果:
總結:
有人曾經說過:“凡事就怕認真二字”。這句話現在來看真的很有道理,尤其是這次的研究,我發現,不是我們學不會,而是我們不會學,我們對待學習,放縱多餘謹慎,將就多餘斟酌,馬虎多餘認真,這樣的學習,最大的表現就是我們頂著物件導向程式設計員的帽子,卻渾然不知,我們經不起深入與字字必究的代碼檢查!這個也是在看完公司的代碼後,給我的最大感觸!我們在以後的學習中,我們還是要有點“學究”精神的!