《《委托和事》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《委托和事》PPT课件.ppt(23页珍藏版)》请在三一办公上搜索。
1、1,第6章 委托和事件,委托的概念,面向对象的核心思想之一就是将数据和对数据的操作封装为一个整体。委托变量可以看成是一种安全的函数指针,它只能接受符合其要求的函数地址。函数传递的是数据对象委托(delegate)传递的是函数本身,委托和方法,3,委托封装方法委托类型定义,delegate void DualFunction(int x,int y);public static void Add(int x,int y)Console.WriteLine(0+1=2,x,y,x+y);,与要绑定的方法原型一致,委托和方法,4,委托封装方法委托类型定义委托对象创建,delegate void Du
2、alFunction(int x,int y);public static void Add(int x,int y)Console.WriteLine(0+1=2,x,y,x+y);public static void Main()DualFunction fun1=new DualFunction(Add);,委托和方法,5,委托封装方法委托类型定义委托对象创建调用方法,delegate void DualFunction(int x,int y);public static void Add(int x,int y)Console.WriteLine(0+1=2,x,y,x+y);pub
3、lic static void Main()DualFunction fun1=new DualFunction(Add);Add(1,2);fun1(1,2);,与一般方法调用格式相同,委托和方法,6,委托封装方法,DualFunction fun1=new DualFunction(Add);,委托和方法,7,委托封装方法,DualFunction fun1=new DualFunction(Add);fun1(2,3);,委托和方法,8,委托封装方法,DualFunction fun1=new DualFunction(Add);fun1(2,3);fun1=new DualFuncti
4、on(Sub);,委托和方法,9,委托加减,DualFunction fun1=new DualFunction(Add);fun1(2,3);fun1+=new DualFunction(Mul);,委托和方法,10,委托加减,DualFunction fun1=new DualFunction(Add);fun1(2,3);fun1+=new DualFunction(Mul);fun1(2,3);,委托和方法,11,传递委托对象作为方法参数作为方法返回值,委托和方法,12,Delegate类型DynamicInvokeFun1(2.5,2)Fun1.DynamicInvoke(2.5,2
5、)Combine/RemoveDualFunction fun3=fun1+fun2DualFunction fun3=(DualFunction)(Delegate.Combine(fun1,fun2);,匿名方法,13,委托调用方法命名方法匿名方法,public static void Add(int x,int y)Console.WriteLine(0+1=2,x,y,x+y);.DualFunction fun1=new DualFunction(Add);,DualFunction fun1=delegate(int x,int y)Console.WriteLine(0+1=2,
6、x,y,x+y);,匿名方法,14,外部变量,double a=2.5,b=2;DualFunction fun1=delegate(int a,int b)a+;b+;fun1(a,b);DualFunction fun2=delegate(int a,int b)a+;b-;fun2(a,b);,捕获外部变量,捕获外部变量,事件的概念,事件源响应者一个事件源,多个响应者委托发布和订阅定义委托类型,并在发布者类中定义一个该类型的公有成员;在订阅者类中定义委托处理方法;订阅者对象将其事件处理方法合并到发布者对象的委托成员上;发布者对象在特定的情况下激发委托,从而自动调用订阅者对象的委托处理方法
7、;,事件处理,16,委托发布和订阅发布者,delegate void LightEvent(bool color);public class TrafficLight private bool color;public LightEvent OnColorChange;public void ChangeColor()color=!color;if(OnColorChange!=null)OnColorChange(color);,委托类型定义,委托成员定义,委托激发方法,事件处理,17,委托发布和订阅发布者订阅者,public class Car private bool bRun;publ
8、ic void Enter(TrafficLight light)light.OnColorChange+=LightColorChange;public void LightColorChange(bool color)if(bRun,委托处理方法,委托绑定,事件处理,委托发布和订阅,发布者(TrafficLight),触发器(ChangeColor),委托(OnColorChange),订阅者(Car),委托处理方法LightColorChange,delegate LightEvent,事件处理,19,事件发布和订阅发布者,delegate void LightEvent(bool co
9、lor);public class TrafficLight private bool color;public event LightEvent OnColorChange;public void ChangeColor()color=!color;if(OnColorChange!=null)OnColorChange(color);,事件处理,20,事件发布和订阅发布者订阅者,public class Car private bool bRun;public void Enter(TrafficLight light)light.OnColorChange+=LightColorChan
10、ge;public void LightColorChange(bool color)if(bRun,事件处理,21,事件发布和订阅发布者订阅者,public class Bus private bool bRun;public void Enter(TrafficLight light)light.OnColorChange=LightColorChange;public void LightColorChange(bool color).,事件处理,22,使用EventHandler发布者,public class TrafficLight private bool color;publi
11、c EventHandler OnColorChange;public void ChangeColor()color=!color;if(OnColorChange!=null)OnColorChange(this,null);,事件处理,23,事件发布和订阅发布者订阅者,public class Car private bool bRun;public void Enter(TrafficLight light)light.OnColorChange+=LightColorChange;public void LightColorChange(object sender,EventArgs e)TrafficLight light=(TrafficLight)sender;if(bRun,