• 泛型进阶


       首先说明一下,写的博客比较基础一些,如果是老司机或者大牛的话可以跳过这篇博客了。

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

    写的只是自己总结的知识,如果哪里写的不好,还请大牛指点一下。

     

  • 相关阅读:
    开发微信App支付
    SAP 数据类型
    SAP RFC函数
    单点登录
    集中式与分布式
    SAP 表类型
    独立软件供应商
    SAP 优缺点
    SAP 使用
    SAP 费用
  • 原文地址:https://www.cnblogs.com/renzhitian/p/6211541.html
Copyright © 2020-2023  润新知