using System;
using System.Collections.Generic;
using System.Text;
namespace 自定义泛型
{
/// <summary>
/// @author ZJC
/// 1.自定义泛型类
/// 2.自定义泛型接口,封闭类型、开放类型介绍
/// 3.泛型约束
/// 泛型的目的也是为了代码重用
/// </summary>
class Program
{
//
//class MyGeneric<T,K,L,D,C>
//下面是一个自定义泛型类的实例
class MyGeneric<T>
{
public class Car
{
Car()
{
Console.WriteLine("Car...");
}
}
public class Course
{
Course()
{
Console.WriteLine("course...");
}
}
public MyGeneric(int len)
{
arr = new T[len];
}
private T[] arr;
public T this[int index] //索引器
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
}
//以下是:自定义泛型接口 实例
public interface ITest<T>
{
void M1(T t);
}
public class MyGeneric2 : ITest<string> //封闭类型,固定为string
{
public MyGeneric2()
{
Console.WriteLine("kk");
}
public void M1(string t)
{
Console.WriteLine(t);
}
}
public class MyGeneric3<T> : ITest<T> //开放类型,类型不固定
{
public void M1( T t)
{
Console.WriteLine(t.GetType());
}
}
//泛型约束
public class Person<T, T1, T2>
where T : struct
where T1 : class
where T2 : new()
//约束了T 必须是【值类型】,T1 必须是【引用类型】,T2这个类型必须带有无参构造函数,要求构造函数不能为私有且类型不能是抽象的。
{
public T age
{
get;
set;
}
public T1 Mycourse
{
get;
set;
}
public T2 Mycar
{
get;
set;
}
}
static void Main(string[] args)
{
MyGeneric<string> test = new MyGeneric<string>(3);
test[0] = "成龙";
test[1] = "李连杰";
test[2] = "甄子丹";
Console.WriteLine(test[0]+"\n"+test[1]+"\n"+test[2]);
MyGeneric2 test2 = new MyGeneric2();
test2.M1("自定义泛型接口");
MyGeneric3<int> test3 = new MyGeneric3<int>();
test3.M1(5);
Person<int,MyGeneric2,MyGeneric2> test4 = new Person<int,MyGeneric2,MyGeneric2>();
}
}
}