/**//*--- * 如何 使用 和 继承 抽象泛型类 * 派生约束 ---*/ using System; using System.Collections.Generic; // 泛型抽象类 publicabstractclass GenericParent { // 泛型抽象方法,返回值为一个泛型,加一个约束使泛型X要继承自泛型Y publicabstract X Output<X, Y>(X x, Y y) where X : Y; // 泛型抽象方法,返回值为一个string类型,加一个约束使泛型X要继承自泛型Y publicabstractstring Output2<X>(X x) where X : System.ComponentModel.IListSource; } publicclass GenericChild : GenericParent { // 重写抽象类的泛型方法 publicoverride T Output<T, Z>(T t, Z z) { return t; } // 重写抽象类的泛型方法 publicoverridestring Output2<T>(T t) { return t.GetType().ToString(); } } public partial class Generic_Abstract : System.Web.UI.Page { protectedvoid Page_Load(object sender, EventArgs e) { GenericChild gc =new GenericChild(); Response.Write(gc.Output<string, IComparable>("aaa", "xxx")); Response.Write("<br />"); Response.Write(gc.Output2<System.Data.DataTable>(new System.Data.DataTable())); Response.Write("<br />"); } }
运行结果
aaa
System.Data.DataTable
泛型接口,派生约束,构造函数约束
/**//*--- * 如何 使用 泛型接口 * 派生约束 * 构造函数约束(如果实例化的话) ---*/ using System; using System.Collections.Generic; // 泛型接口 publicinterface IGenericInterface<T> { T CreateInstance(); } // 实现上面泛型接口的泛型类 // 派生约束where T : TI(T要继承自TI) // 构造函数约束where T : new()(T可以实例化) publicclass Factory<T, TI> : IGenericInterface<TI> where T : TI, new() { public TI CreateInstance() { returnnew T(); } } public partial class Generic_Interface : System.Web.UI.Page { protectedvoid Page_Load(object sender, EventArgs e) { IGenericInterface<System.ComponentModel.IListSource> factory = new Factory<System.Data.DataTable, System.ComponentModel.IListSource>(); Response.Write(factory.CreateInstance().GetType().ToString()); Response.Write("<br />"); } }
运行结果
System.Data.DataTable
其它
/**//*--- * 泛型 其它 ---*/ using System; using System.Collections.Generic; // 泛型也可以使用别名 using MyList = System.Collections.Generic.List<string>; public partial class Generic_Other : System.Web.UI.Page { protectedvoid Page_Load(object sender, EventArgs e) { MyList ml =new MyList(); ml.Add("aaa"); ml.Add("bbb"); Response.Write(ml[0]); Response.Write("<br />"); Response.Write(ml[1]); // 其它说明 // 值类型约束 public class MyClass<T> where T : struct { } // 引用类型约束 public class MyClass<T> where T : class { } // 没有泛型属性 } }