泛型进阶

   首先说明一下,写的博客比较基础一些,若是是老司机或者大牛的话能够跳过这篇博客了。函数

   咱们进入正题,在上篇博客中,咱们讲了泛型的由来以及泛型与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关键字是语法糖,返回编译器指定的值类型。

写的只是本身总结的知识,若是哪里写的很差,还请大牛指点一下。

相关文章
相关标签/搜索