欢迎来到天天文库
浏览记录
ID:53289429
大小:79.50 KB
页数:4页
时间:2020-04-03
《c#回调浅析(委托、接口回调).doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C#回调浅析(委托、接口回调)说到c#冋调,通常情况下,指的是某个委托或者接口冋调。现将从网上备位前辈那里学得的一些经验加以整理,形成一个稍全面一些的文章,希望对大家有所帮助!一、委托先看一段代码://定义委托delegatevoidWorkDone();classProgram{staticvoidMain(string[]args){Do();Console.ReadLine();}publicstaticvoidDo(){//首先给callback委托赋值WorkDonecallback=newWorkDone(WorkDoneIIandler);//将callback作为参数W
2、orking(callback);}publicstaticvoidWorking(WorkDonecallBack){//当工作完成的时候执行这个委托callBack();}publicstaticvoidWorkDoneHandler(){Console.WriteLine(DateTime.Now);上面的代码屮,将方法WorkDoneHandler()作为参数,传递给了另一个方法Working(WorkDonecallBack),这样做的好处在于,可以动态的指泄执行哪个方法。比如在Do()方法中,我们指定的callback是WorkDoneHandler当然也可以是其它匹配的方
3、法。而Working0方法根木不需要知道白己最示执行的是哪个Ilancller0二、接口回调通常情况下,我们创建一个对象,并马上肓接去使用它的方法。然而,在有些情况下,希望能在某个场景出现后或条件满足时才调用此对象的方法。冋调就可以解决这个“延迟调用对象方法”的问题。这个被调用方法的对彖称为I川调对象。实现冋调的原理简介如下:首先创建一个冋调对彖,然示再创建一个控制器对象,将冋调对彖需要被调用的方法告诉控制器对象。控制器对象负责检杳某个场景是否出现或某个条件是否满足。当此场景出现或此条件满足时,白动调用回调对象的方法。以下为C#实现冋调的一个小例子:usingSystem;usingS
4、ystem.Collections.Generic;usingSystem.Text;namespaceConsoleApplicationl{classProgram{staticvoidMain(string[]args){〃创建一个控制器对象,将提供给它的冋调对象传入Controllerobj=newController(newCallBackO);//启动obj.Star();}}publicinterfaceIBack{voidrun();}publicclassCalIBack:IBack{publicvoidrun(){//为了简洁这里只是显示下时间System.Cons
5、ole.WriteLine(DateTime.Now);}}publicclassController{publicIBackCallBackObj=null;//这里引用冋调对象publicController(IBackobj){this.CallBackObj=obj;}publicvoidStar(){Console.WriteLine(/x敲键盘任意键就显示当前的时间,直到按ESC退出…・");while(Console.ReadKey(true).Key!=ConsoleKey.Escape){CallBackObj.run();}}可以看到,当示例程序运行时,何时调用Ca
6、lIBack对象的run()方法是由用户决定的,用户每敲一个键,控制器对象就调用一次CalIBack的mn()方法。这个示例屮实现冋凋的关键在于IBack接口的引入。如果不丿IJIBack接口,而育接使川SllBdck对象,一样可以实现同样的效果,如下:publicclassController{publicCalIBackCallBackObj=null;//冋调对象方法的引用publicController(Cal1Backobj){this.CallBackObj=obj;}publicvoidStar(){Console.WriteLine(”敲键盘任意键就显示当前的时间,直到
7、按ESC退出・..・");while(Console.ReadKey(true).Key!=ConsoleKey.Escape){CallBackObj.run();}}但仔细思考,这样做的结果就使Controller类与CalIBack对彖绑定在…起,力一如果需要调用其他类型的对象,则必须修改Controller类的代码。如果Controller类接收的是一个抽象的接口变量Iback,贝U任何实现了该接口的对象部可以被Controller类对
此文档下载收益归作者所有