C回调函数与java回调方法

来源:互联网 发布:零境网络有哪些游戏 编辑:程序博客网 时间:2024/04/30 09:22

回调函数,我一开始不是很理解这到底是什么东西,之后看了看书籍和网上的资料,加上自己在编程上也用到这些东西,虽然自己可能也没有完全理解,但是还是根据自己的想法,把这些东西自己归纳下。


一般来说我个人总结回调函数和回调方法,其实主要是更多的时候,人们喜欢把面向对象的语言中的实现方式称为method——方法,而在面向对象时候称为function——函数,其实总之就是一个意思,实现回调。但是由于C和java的机制不一样,所以实现的方式也不一样。


在C中,一个最为人熟悉的东西就是指针,所以回调函数的实现也是通过指针实现的,实际上回调函数就是一个函数指针(函数指针C语言的书上有写出),下面就是一个简单的例子。


实例代码如下:

//两个功能两个函数:void fuck(void){//要实现的功能}void cao(void){//要实现的功能}void makeLove(void *(*ptr)()){//要实现的功能*(*ptr)();}void main(){makeLove(cao);//调用第一个makeLove(fuck);//调用第二个}


这样看上去,整个程序是不是很简洁下?只需要一个规定的接口就可以调用不同的函数 。这样的好处在于已经定义好了接口,像变化的参数一样使用不同的函数,也就是在不同的时刻不用 显式的去调用某个方法。


而在java中,由于安全的考虑,屏蔽了指针这一危险操作,所以不能直接使用函数指针进行回调函数的使用,但是由于java的面向对象和多态性,可以通过一个新的方式:接口,来实现所谓的回调方法。


实例代码如下:(这里转载网上,因为例子比较好)

pubilc interface CallBack{<span style="white-space:pre"></span>public void callbackMethod();           } public class A implements CallBack{  // A实现接口CallBack<span style="white-space:pre"></span>B b = new B();<span style="white-space:pre"></span>public void do(){      <span style="white-space:pre"></span>b.doSomething(this); // A运行时调用B中doSomething方法,以自身传入参数,B已取得A,可以随时回调A所实现的CallBack接口中的方法}                   public void callbackMethod(){  // 对A来说,该方法就是回调方法<span style="white-space:pre"></span>System.out.println("callbackMethod is executing!");                      } public class B{<span style="white-space:pre"></span>public void doSomething(CallBack cb){  // B拥有一个参数为CallBack接口类型的方法<span style="white-space:pre"></span>System.out.println(“I am processing my affairs… ”);<span style="white-space:pre"></span>System.out.println(“then, I need invoke callbackMethod…”);<span style="white-space:pre"></span>cb.callbackMethod();}  

这里没有写主方法,但大家可以想象一下在主方法里调用的A类的do方法,会是什么结果,结果就是三个都会输出。实际上在A中调用了B的方法,而B方法中参数又包括一个接口,里面有一个接口的方法,这样调用B的时候,由于传递的参数是A(this指向),所以CallBack 的实例化是A,所以cb.callbackMethod实际上调用的是A.callbackMethod这个方法,因为A实现了ccallback这个接口,这就是java接口的机制,通过继承接口实现方法,在子类中实现,如果想换成其他的方法,那么可以再写一个C类,再次实现callback这个接口中的callbackMethod。


综上,回调函数或者回调方法可以认为是被动的实现,就比如去和他人完成某个任务,你不必完成所有功能,也可以实现异步的操作,这些当然就是后话了。


0 0
原创粉丝点击