泛型進階


   首先說明一下,寫的博客比較基礎一些,如果是老司機或者大牛的話可以跳過這篇博客了。

   我們進入正題,在上篇博客中,我們講了泛型的由來以及泛型與object類型的區別與優點,以及泛型方法編譯時的原理。

   接下來我們了解一下泛型的其他用法。

   泛型當然不是只能拿來定義方法,不僅僅寫在方法頭,還可以使用在泛型的返回以及泛型類、泛型方法、泛型接口和泛型委托,那么泛型在前面幾種情況下是如何聲明的那?

   直接上代碼!

 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>
 {
 }

所以,我們看出兩種實現方式其實就是類與接口參與類型一致的過程。
泛型委托就不寫了,后面寫委托的時候再說吧。

接下來說一下重頭菜泛型約束,如何學習泛型約束那?我們回到最開始的初衷,為什么要用泛型。

我們來看一下一開始的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關鍵字是語法糖,返回編譯器指定的值類型。

寫的只是自己總結的知識,如果哪里寫的不好,還請大牛指點一下。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM