Target:利用泛型,委托 自定义Sort排序规则
已有类Vector,要对很多的Vector实例自定义排序规则。
思路,定义一个类Vectors,继承List<Vector>这样就有了一个Vector类型的集合Vectors。这个Vectors还有很多的List<Vector>的方法。
实现List<T> 中的Sort()方法。
public class Vector { /*类定义*/ } public class Vectors : List<Vector> { /* 类定义*/ } public static class VectorDelegates { public static int Compare(Vector x, Vector y) { /*方法定义*/ } } Vectors route = new Vectors(); Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare); route.Sort(sorter);
以上代码省略具体的实现。
1. 首先,.Net Framework 中有很多模板。原来如果希望某个类有某些功能,因为通用的关系,需要继承很多的接口。模板类,就是具有固定的方法、属性的一个模板。
2. 以List<T> 为例:
它里面有个public void Sort(Comparison<T> comparison); 方法
其中的的参数Comparison<T>是委托。
让我们来看看他的原型:
namespace System
{
public delegate int Comparison<in T>(T x, T y);
}
3. 现在我们要自定义这个Sort方法,在我们调用 route.Sort的时候,可以按照我们要求的方式排序。
为了实现自定义的Sort,我需要去传递一个函数委托,大概的形式是这样的:
<List<T>的实例的名字>.Sort(Comparison<T> 的委托)
4. 那么就涉及到函数委托怎么写:
Comparison<T> sorter= new Comparison<T>(被委托的函数名)
要注意,是函数名,不是函数声明也不是调用!
5. 那么什么样的函数可以匹配给委托呢。返回值和参数相同。
观察这个
public delegate int Comparison<in T>(T x, T y);,他的返回值是int, 接受两个T类型的参数。那么我们也要定义一个这样的函数。假定,T是Vector类型
public int int Compare(Vector x, Vector y)
{
/* 自定义*/
}
于是我们可以在静态类VectorDelegates定义一个静态方法Compare,用这个方法创建一个sorter的委托。
Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare);
最后达到自定义排序规则的目的。
route.Sort(sorter); //route 是public class Vectors : List<Vector> 的一个实例。
6.上面的语句也可以简化为:
route.Sort(VectorDelegates.Compare);
Sort的参数是一个实例,上面的方式是隐式创建的这个类的实例。对VectorDelegates.Compare()的引用没有括号,称为方法组(method group)