泛型

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

原文地址:https://www.cnblogs.com/cdaq/p/4618603.html