• 泛型


    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();
    }
    }

  • 相关阅读:
    wget(转)
    852. Peak Index in a Mountain Array
    617. Merge Two Binary Trees
    814. Binary Tree Pruning
    657. Judge Route Circle
    861. Score After Flipping Matrix
    832. Flipping an Image
    461. Hamming Distance
    654. Maximum Binary Tree
    804. Unique Morse Code Words
  • 原文地址:https://www.cnblogs.com/cdaq/p/4618603.html
Copyright © 2020-2023  润新知