首先說明一下,寫的博客比較基礎一些,若是是老司機或者大牛的話能夠跳過這篇博客了。函數
咱們進入正題,在上篇博客中,咱們講了泛型的由來以及泛型與object類型的區別與優勢,以及泛型方法編譯時的原理。學習
接下來咱們瞭解一下泛型的其餘用法。spa
泛型固然不是隻能拿來定義方法,不單單寫在方法頭,還可使用在泛型的返回以及泛型類、泛型方法、泛型接口和泛型委託,那麼泛型在前面幾種狀況下是如何聲明的那?code
直接上代碼!blog
1 /// <summary> 2 /// 泛型返回 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="tParameter"></param> 6 /// <returns></returns> 7 public static T Get<T>(T tParameter)//Show`1 8 { 9 return tParameter; 10 } 11 /// <summary> 12 /// 泛型類 13 /// </summary> 14 /// <typeparam name="T"></typeparam> 15 public class generous<T> 16 { 17 18 } 19 /// <summary> 20 /// 泛型接口 21 /// </summary> 22 /// <typeparam name="T"></typeparam> 23 public interface IShow<T> 24 { 25 void Show(T tParameter); 26 } 27 /// <summary> 28 /// 泛型委託 29 /// </summary> 30 /// <typeparam name="S"></typeparam> 31 /// <param name="Show"></param> 32 public delegate void geners<S>(S Show);
從上面咱們能夠曉得泛型各類聲明方式,以及泛型的普遍使用,好,咱們接下來看一下泛型類和泛型接口繼承
咱們思考一個問題,普通類如何實現泛型接口的?接口
這裏有兩種方法實現,第一種就是接口泛型參數指定編譯器
//指定了泛型的類型 public class shous: generous<int> { }
可是指定類型之後,泛型接口也就等於普通接口,那麼另外一種方式就是普通方法佔位符與接口一致,你們都是泛型博客
//給類指定泛型佔位符 public class shous<T>: generous<T> { }
因此,咱們看出兩種實現方式其實就是類與接口參與類型一致的過程。
泛型委託就不寫了,後面寫委託的時候再說吧。it
接下來講一下重頭菜泛型約束,如何學習泛型約束那?咱們回到最開始的初衷,爲何要用泛型。
咱們來看一下一開始的object類型的方法
從上圖能夠看到,咱們object類型只有這四個方法,體現了object的侷限性很大。沒有法律就沒有自由,沒有約束就沒有權利,那麼就有了約束。
下面跟着個人腳步進去泛型約束,咱們先看下父類約束和接口約束
約束了父類,父類的子類均可以寫進去,即便屬性一致不是子類都不能使用
接口約束:約束了之後必定繼承了約束的方法
接口約束能夠有多個,類型約束只能有一個
看一下代碼
public static void ShowEast<T>(T tParameter) where T : People, ISports { Console.WriteLine("{0} {1}", tParameter.Id, tParameter.Name); }
people是類名,ISports是接口名,new()是無參構造函數,接口約束能夠有多個,類型約束只能有一個,相似普通的繼承,這裏約束語法是where T
public static void Show<T>(T tParameter) where T : People, ISports, IDisposable, new() { Console.WriteLine("{0} {1}", tParameter.Id, tParameter.Name); //約束後,能夠在方法裏面直接使用該類型的屬性和方法 tParameter.Pingpang(); tParameter.Dispose(); T t = new T(); }
看一下方法的調用
Contraintes.Show<Chinese>(chinese);
這裏咱們調用chinese這個類,由於chinese繼承於people,因此能夠直接重載了,這個要曉得一個事,就是子類必須繼承約束的父類才能夠,即便某個類的屬性與父類存在一致性,也是不能夠的,由於違背了約束大原則,就不能如今類裏的屬性和方法。
還要提的一個地方就是回調方法時,若是咱們不指定參數的狀況下,咱們時無法指定返回類型,由於值類型與引用類型返回的類型不一致。
public static T Get<T>() //where T : class//表示引用類型 //where T : struct//表示值類型//值類型沒有統一的默認值, where T : new()//默認構造函數約束,表示T必定有一個無參數構造函數 { //return null;//引用類型返回值 //return default(T);//default關鍵字,根據實際類型,返回默認值 return new T(); }
由於引用類型沒有一致的默認值,只能返回default(T),這裏default關鍵字是語法糖,返回編譯器指定的值類型。
寫的只是本身總結的知識,若是哪裏寫的很差,還請大牛指點一下。