• 泛型


    1

    约束
    /// <summary>
    /// 1.0 基类约束 ,约束成了T必须传入Pig本身或者其子类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PigHouse<T> where T : Pig
    {
    /// <summary>
    /// 泛型方法使用的类型占位符使用的是泛型类中的类型占位符,则可以省略不写
    /// </summary>
    /// <returns></returns>
    public T GetT()
    {
    return default(T);
    }

    /// <summary>
    /// 泛型方法使用的类型占位符是泛型类中的类型占位符之外的,则必须使用<K>来指定,否则报错
    /// </summary>
    /// <typeparam name="K"></typeparam>
    /// <returns></returns>
    public K GetK<K>()
    {
    return default(K);
    }
    }


    /// <summary>
    /// 2.0 接口约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class House1<T> where T : IPig
    {

    }

    /// <summary>
    /// 3.0 引用类型约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class House2<T> where T : class
    {

    }

    /// <summary>
    /// 4.0 值类型约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class House3<T> where T : struct
    {

    }

    /// <summary>
    /// 5.0 构造器约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class House4<T> where T : new()
    {
    T t;
    public House4()
    {
    //由于在此处要new T()所以必须在类后面添加构造器约束,才能保证正常
    t = new T();
    }

    public T Instance
    {
    get
    {
    return t;
    }
    }
    }


    2 泛型方法
    /*
    * 泛型方法:
    * 1、泛型方法既可以定义在普通类中也可以定义在泛型类型中
    * 2、泛型方法构成重载的条件:1、方法参数格式不同 2、方法参数类型不同 3、方法的类型占位符的个数不同,注意类型占位符格式相同但是名称不同不构成重载
    *
    */
    public class GenMethodDemo
    {


    /// <summary>
    /// 泛型方法的类型占位符只在方法的方法体,返回类型,参数中有效
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public T GetT<T>(T t)
    {
    T tt = t;
    return tt;
    }

    /// <summary>
    /// 利用default关键字将T对应的具体类型进行取默认值返回
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public T GetT1<T>()
    {
    return default(T);
    }

    public T GetT1<T>(T t)
    {
    return t;
    }

    public T GetT1<T>(int t)
    {
    return default(T);
    }

    public T GetT1<T, V>(int t)
    {
    return default(T);
    }

    public string Get()
    {
    return "";
    }
    }


    3 泛型继承

    // <summary>
    ///
    /// </summary>
    /// <typeparam name="K">K必须是一个引用类型</typeparam>
    /// <typeparam name="V">V必须是一个值类型</typeparam>
    public class BaseCls<K, V>
    where K : class
    where V : struct
    {

    }

    /// <summary>
    /// 1.0 如果是普通类继承泛型类型,则应该确定好泛型类中的各个类型占位符的具体类型
    /// </summary>
    public class subCls1 : BaseCls<Pig, int>
    {

    }

    //报错,因为找不到类型K和V
    //public class subCls3 : BaseCls<K, V>
    //{

    //}

    /// <summary>
    /// 2.0 泛型类继承泛型类,可以指定具体的类型
    /// </summary>
    /// <typeparam name="X"></typeparam>
    /// <typeparam name="Y"></typeparam>
    public class subCls2<X, Y> : BaseCls<Pig, int>
    {

    }

    /// <summary>
    /// 3.0 常用的继承方式,可以将泛型类的类型占位符传递给父类
    /// </summary>
    /// <typeparam name="X"></typeparam>
    /// <typeparam name="Y"></typeparam>
    public class subCls3<X, Y> : BaseCls<X, Y>
    where X : class
    where Y : struct
    {

    }

    4 泛型类的重写
    public abstract class AbsBaseCls
    {
    //泛型方法添加约束
    public abstract T SayHi<T, U>(T t, U u) where U : T;//U 必须继承于 T
    }

    public class SubClass1 : AbsBaseCls
    {
    public override T SayHi<T, U>(T t, U u) //在子类中重写泛型方法的时候不需要再添加类型占位符的约束,此约束已经从父类继承 ,如果添加了 where U : T 会报错
    {
    throw new NotImplementedException();
    }
    }

  • 相关阅读:
    功能3 -- 基于jquery的load()实现多个.html静态页,引用同一个header.html和footer.html文件
    功能2 -- hover出现遮照效果
    功能1 -- 顶部导航栏和返回顶部效果
    使用swiper简单的h5下滑翻页效果,
    Vue源码阅读,如何渲染代码块生成? 本文详解
    这15道Vue常见面试题,你会几道??
    学会这些Vue小技巧,可以早点下班和女神约会了!
    TypeScript在Model中是如何操作运用的?本文详解
    Vue3教程,抢先学习
    Webpack 5模块联邦会不会引发微前端的革命呢? 本文详解
  • 原文地址:https://www.cnblogs.com/cdaq/p/4618603.html
Copyright © 2020-2023  润新知