您的位置:首页 > 其它

泛型(带点委托)

2015-07-22 21:25 302 查看
泛型类:

//泛型类
class MyClass<T>
{

private T _val;

public T Val
{
get { return _val; }
set { _val = value; }
}

public MyClass(T[] _names)
{
this.names = _names;
}

private T[] names = null;

public void Show()
{
foreach (T item in names)
{
Console.WriteLine(item);
}
}
}


MyClass mc = new MyClass(new string[] { "A", "B", "C" });
MyClass<int> mc = new MyClass<int>(new int[] { 10, 20, 30 });
MyClass<string> mc = new MyClass<string>(new string[] { "A", "B", "C" });
mc.Show();
Console.Read();


泛型方法:

//泛型方法
public class Person
{
//方法后直接写<T>就表示是一个泛型方法
public void Show<T>(T msg)
{
Console.WriteLine(msg);
}
}


使用:

Person p = new Person();
//p.Show<string>("aaaaaa");

//p.Show<int>(123);
//对于泛型方法下面的两种调用方式都是正确的。没写的时候会自动识别
p.Show("aaaaaa");
p.Show<string>("fdsfds");

Console.Read();


泛型接口:

//泛型接口
public interface IFlyable<T>
{
void Fly(T msg);

T GetTValue(T msg);
}


实现:

//编写一个类来实现泛型接口
//一个普通类实现了泛型接口
public class SupperMan : IFlyable<string>
{

#region IFlyable<string> 成员

public void Fly(string msg)
{
Console.WriteLine(msg);
}

#endregion
}

//泛型类实现泛型接口,尖括号内可以不是T,单多数定义为T,
//泛型类实现泛型接口,当泛型类是什么类型,就把该类型给泛型接口
//where 是限制条件

public class SpiderMan<YZK, W> : IFlyable<YZK> where YZK : new()
{

#region IFlyable<YZK> 成员

public void Fly(YZK msg)
{
throw new NotImplementedException();
}

#endregion

#region IFlyable<YZK> 成员

public YZK GetTValue(W msg)
{
return new YZK();
}

#endregion
}


泛型委托:

注意,以后只要用到委托,基本上不用我们自己定义,.NET都已经给我们定义好了

public delegate void M1Delegate(string msg);

//泛型委托
public delegate void MGenericDelegate<T>(T arg);

#region 泛型委托
//M1Delegate md = M1;
//md("aaaaaaaa");
//Console.Read();

//M1Delegate md = M2;

//Console.Read();
//MGenericDelegate<string> md = M1;
//md("aaaa");

//MGenericDelegate<int> md = M2;
//md(1000);

MGenericDelegate<double> md = M3;
md(993.5);
Console.Read();

static void M1(string msg)
{
Console.WriteLine(msg);
}
static void M2(int msg)
{
Console.WriteLine(msg);
}
static void M3(double msg)
{
Console.WriteLine(msg);
}
static void M4(float msg)
{
Console.WriteLine(msg);
}
static void M5(Person msg)
{
Console.WriteLine(msg);
}


系统内置泛型委托:

Func,无论多少泛型,永远最后一个泛型是返回值类型

Action没有返回值,泛型都是参数

list.where() 括号内是一个泛型委托

#region 系统内置的泛型委托
//只要是Action委托都是无返回值的。一或以上个参数用泛型Action,无参无返回值用Action

//1.存储无参数无返回值的方法
Action md = () => { Console.WriteLine("无参数无返回值。"); };
md();
Console.Read();

//2.有两个参数没有返回值
Action<string, int> md = (s, i) => { Console.WriteLine(s + "   " + i); };
md("aaaaaaa", 10);
Console.Read();

//当需要存储带返回值的方法的时候,就需要使用另外一个泛型委托Func

//返回值是string
Func<string> fn = T1;

string ss = fn();
Console.WriteLine(ss);
Console.Read();

//返回值是string类型,参数是一个int类型
Func<int, string> fn = n => n.ToString();
Console.WriteLine(fn(10));
Console.Read();

Func<int, int, string> fn = T2;
Console.WriteLine(fn(12, 5));
Console.Read();

Action<string>
#endregion


泛型约束:

//使用泛型约束,约束了T只能是值类型
class MyClass<T> where T : struct
{

}

//使用泛型约束,约束了T只能是引用类型不能是值类型
class MyClass<T> where T : class
{

}

//限制T必须是实现了某个接口的类型,要求T必须是实现了IComparable接口的子类型对象或者就是该接口类型对象
class MyClass<T> where T : IComparable
{
}

//要求T必须是Person类型,或者是Person类的子类
class MyClass<T> where T : Person
{
}

//要求T必须是Person类型,或者是Person类的子类
class MyClass<T, V>
where T : Person
where T : new() //要求将来传递进来的类型必须具有一个无参数的构造函数
where V : T
{
}

//对T没有要求,但是V必须是T类型或者T类型的子类型
class MyClass<T, V>
where V : T
{
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: