分层---回调函数,回调接口,委托,异步所有事情的源头1

 回调的本质还是调用,这里的调用的不仅仅是函数调用,可以是类。

       同步调用,回调,异步调用这三个概念,我看到有些人拿在一起比较。个人的看法就是,这三个概念不是平行的,平行这个词不大合适,不管怎样这三个词不是表示同一个概念的三种形式。我个人的看法就是:同步调用与回调可以放在一起比较讨论;而同步调用与异步调用应该放在一起讨论;异步调用有时候要用到回调。异步不可避免的要与多线程联系在一起。

       在我们生活的这个世界里,人是分层的,有些人就是压迫阶级,有些人就是被压迫的。在程序世界里也是分层,有些就是服务层,有些就是被服务层。某一层A利用另一层B时,而且要等到B完成返回时A才能继续自己未完的东西,就是同步调用;(A,B不一定是函数),而A在调用B的同时,B不服气,也想调用A,这就是回调;异步调用就是A调用B后立即返回继续自己的操作,至于B完成后如何处理另外再说。

      回调只是一种机制,而不是一种技术,记住这点很重要。在各种语言里实现回调的方法不一样,C/C++里面是通过函数指针实现的,java里面是用回调接口实现的(待证实),其实这么一想,C++也可以用回调接口实现,C#可以通过回调接口实现,也可以通过委托这个极具创造性的东西实现,多么可爱的东西。

     先来看C语言,比如某一层有一个求微积分的函数,MD,打不出微积分的那个符号,∫ab(1+x)dx,∫ab(x2+3)dx...如果为每一个函数写一个求微积分的函数,太麻烦了。可以写一个通用的函数double integral(double a,double b,double(*fun)(double)).这是B层,求微积分的,OK,我这一层能做的就这么多,你随便哪一层想使用这个函数,自己去解决F(x)=1+x,F(x)=x2+3等等这类问题吧,到时候你给我一个地址,我调用就是了。好,这时,某一个函数fun2想用它,那么这个函数的作者还写了求F(x)=1+x,F(x)=2x+3的函数fun1,外加调用double integral(double a,double b,double(*fun)(double))函数的函数fun2。这个fun1和fun2就是A层。显然A的fun2在调用B的integral()函数的时候,B的integral()函数调用了A的fun1函数。这是一种双向调用,层之间的双向,不是函数之间的双向,因为B的integral()并没有调用A的fun2(不知道调用会出现什么样的场景,不想去想,头大了)。当然了,很有可能这三个函数都是一个人写的,所以把握分层的概念要理解透彻。看见没有,回调并不是一门技术,而只是一种机制。这就是C语言实现回调的方法,这也一不小心弄出一个类似“多态”的解决方案,不知道这么说恰不恰当。一个函数指针解决了多个类似问题。我觉得应该是先有回调,然后才有这个类似“多态”的功能。我记得回调的另一个说法:说底层函数调用高层函数的代码,典型的例子就是眼花缭乱的windows API函数使用了大量的回调,看得人都麻了。其实我个人觉得这个说法有点狭义,不要强调高层底层什么的,就是层。因为程序员自己写的代码,在程序员自己看来是平行的,不存在高底层的。比如这个求微积分的函数都是自己写的,哪个是高层,哪个是底层?

      感觉C语言的函数指针就像是埋在另一个函数一个炸弹,一定的时候就引爆它。呵呵...在面向对象的程序设计里,此层埋在另一层的当然就是类对象,为了将来可以扩展用接口当然最合适,其实普通的类也可以做到。有空再写面向对象的回调是怎么一回事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值