泛型

    // 泛型类------可以一个类型满足不同类型的需求---尖括号+占位符
    public class ChildClass2: GenericAbstractClass<int>
    {
        //可以已经指定为int类型
    }
    public class ChildClass : GenericAbstractClass<T> 
    {
        //不行?子类不知道父类是什么类型,延迟声明
    }

    public class ChildClass1<S> : GenericAbstractClass<S>
    {
        //可以--子类由父类决定
    }

    public class ChildClass2<S> 
    {
        public S Show()
        {
          //  return new S();          //变量没有约束无法创建实例  S没指定
            return default(S);         //可以 ,返回的是类型
        }
        public S Show2(S s)
        {
            return s;                   //可以,返回的是参数
        }
    }

  

/// <summary>
        /// 泛型方法   泛型方法----可以一个方法满足不同类型的需求
        /// </summary>
        /// <typeparam name="T">类型变量  类型参数</typeparam>
        /// <param name="tParameter"></param>
        public static void Show<T>(T tParameter)
        {
            Console.WriteLine($"This is {typeof(CommonMethod).Name},parameter={tParameter.GetType().Name},type={tParameter}");
        }
        /// <summary>
        /// 普通方法
        /// </summary>
        /// <typeparam name="T">类型变量  类型参数</typeparam>
        /// <param name="tParameter"></param>
        public static void Show(T tParameter)
        {
            //这样和普通方法一样了,括号里面前面是参数类型,后面是参数    所以在前面加<T> 表明这玩意是泛型
            Console.WriteLine($"This is {typeof(CommonMethod).Name},parameter={tParameter.GetType().Name},type={tParameter}");
        }

  

   //interface
    public interface GenericInterfac<T>
    {
        public T Show();
    }
    GenericInterfac<string> sgenericInterfac = null;
    GenericInterfac<DateTime> dtgenericInterfac = null;
    //delegate
    public delegate T Genericdelegate<T>();
    Genericdelegate<string> sGenericdelegate = null;
    Genericdelegate<DateTime> dtGenericdelegate = null;

//泛型约束--要有真正的自由--就必须要有约束
//1.基类约束
// a.就是把类型参数当做People
// b.调用---就可以传递Popple或者People的子类型
// c.泛型约束:要么不让你进来,如果让你进来,就一定是没有问题

//2接口约束:
// a.把这个T 当做ISports
// b.就只能传递ISports 这个接口或者是实现过这个接口的类
// c.就可以增加功能,可以获取新的功能

//3引用类型约束
// a.就只能传递类型进来

//4.值类型约束
// a.就只能传递值类型进来

//5.无参数构造函数约束
// b.必须有一个无参数构造函数才能当做参数传入

//6.枚举约束
// a.必须是一个枚举类型才能传入

        /// <summary>
        /// 1.基类约束
        ///   a.就是把类型参数People 传入  限定现在的T的类型
        ///   b.调用---就可以传递Popple或者People的子类型
        ///   c.泛型约束:要么不让你进来,如果让你进来,就一定是没有问题
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowBase<T>(T tParameter) where T : People
        {
            Console.WriteLine($"People.Id={tParameter.Id}");
            Console.WriteLine($"People.Name={tParameter.Name}");
            //tParameter.Pingpang();
        }    
    public static void ShowObject(object oParameter)
        {
            //Console.WriteLine("This is {0},parameter={1},type={2}",
            //    typeof(GenericConstraint), oParameter.GetType().Name, oParameter);  
            //传递一个实体对象:操作字段和数据 
            //问题:
            //1.无法去属性字段--因为oParameter是Object; C#是强类型语言,编译时决定参数是什么类型;
            //2.强制转换
            //Console.WriteLine($"People.Id={oParameter.Id}");
            //Console.WriteLine($"People.Name={oParameter.Name}"); 
            People people = (People)oParameter;
            Console.WriteLine($"People.Id={people.Id}");
            Console.WriteLine($"People.Name={people.bing}");
        }    
// oParameter 传入的不一定是people的实现,转换出问题,但是编译通过的,这个就是类型安全问题  
    
   /// <summary>
        /// 接口约束:   2
        ///   a.把这个T 当做ISports
        ///   b.就只能传递ISports 这个接口或者是实现过这个接口的类
        ///   c.就可以增加功能,可以获取新的功能
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowInterface<T>(T tParameter) where T : ISports
        {
            tParameter.Pingpang();
        }
         //接口约束--
       {
           //GenericConstraint.ShowInterface<People>(people);
           GenericConstraint.ShowInterface<Chinese>(chinese);
           GenericConstraint.ShowInterface<Japanese>(japanese);
       }

 

/// <summary>
        /// 引用类型约束   3
        ///    T就只能传递类型进来
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowClass<T>(T tParameter) where T : class
        {
            //T t = new T(); //因为T 可能没有无参数构造构造函数
        }
         {
         GenericConstraint.ShowClass<People>(people);       
         //GenericConstraint.ShowClass<int>(iValue); //因为Int 是结构--值类型
       }
        /// <summary>
        /// 值类型约束   4
        ///  就只能传递值类型进来
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowStruct<T>(T tParameter) where T : struct
        {
            T t = new T();
        }
        //值类型约束
        {
            //GenericConstraint.ShowStruct<Chinese>(chinese);//应用类型--不行         
            GenericConstraint.ShowStruct<int>(iValue);       //因为Int  是Struct
            GenericConstraint.ShowStruct<DateTime>(dtValue); //因为DateTime  是Struct
        }
/// <summary>
        /// 无参数构造函数约束
        ///    a.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowNew<T>(T tParameter) where T : new()
        {
            T t = new T();   //明确为值 可以直接实例化    必须有一个无参数构造函数才能当做参数传入

        }
        //无参数构造函数约束
        {
            GenericConstraint.ShowNew<People>(people);
        }
/// <summary>
    /// 枚举约束
    ///     a.必须是个枚举才能够传递进来
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="tParameter"></param>
    public static void ShowEnum<T>(T tParameter) where T : Enum
        {
             
        }

  

  

 

 

  

  

posted @ 2022-03-08 17:34  wolfsocket  阅读(21)  评论(0编辑  收藏  举报