从功能上来说,委托和接口是比较相似的。其实委托最常见的应用是传统C或C++程序员会使用函数指针的情况。也就是说,委托与函数指针类似,它可以把函数的引用和实现分离开,允许实现作为独立的模块存在。与接口相比,委托有一个优势,使得它的使用比接口更加灵活,那就是委托可以很容易的链接到一起,也就是允许多个委托组合成一个委托链。我们可以用“+=”和“-+”轻松地做到。当然我们在需要地时候还可以手工迭代委托链。比如下面一段代码:
Delegate [] examples = Fxb.GetInvocationList();
foreach(Delegate f in examples)
{
f.DynamicInvoke(args);
}
这段代码是调用委托地GetInvocationList方法检索委托实例的列表,并返回一个System.Delegate对象数组,这些对象构成委托链。这样写有些好处,比如可以用来引发异常,还可以查看委托链中每个方法的值。委托既可以与静态方法关联,也可以与非静态方法相关联,只要先提供此类的一个特定实例即可。foreach(Delegate f in examples)
{
f.DynamicInvoke(args);
}
委托说了半天,继续回头说接口。接口中可以有属性,方法,甚至可以有事件(event),但就是不能包含委托,因为委托是一个类型。我们在接口中使用属性也是很重要的一点,因为这会方便客户使用反射检测并了解实现了这个接口的类的行为。
其实序幕里应该讲讲UML的,但本人比较懒,也就略过了,反正也不是很难的东西,在模式的学习中对UML有个了解也就够了。