java回调函数和抽象类的区别_[转载]转  关于回调函数和虚函数

“不管怎么说,回调函数是继承自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。”

回调函数和C++的虚函数是不一样的东西,虽然都是约定一个接口,让调用者与被调者解耦,但是语义还是有很大区别的。语义上与回调类似的应该是functor。

所谓回调函数,就是你调别人,别人却又回过头来调你。比如,一般来说,库函数是被我们调的,他们提供一些服务,我们的代码是他们的客户,因此存在一种清晰的层次关系。即,常规情况下,只有我们去调他们,没有他们调我们,库函数在低层,我们在高层。然而,像qsort这种函数,能够接受一个来自客户的函数指针,我们调了qsort,qsort又回过头来调我们定义的函数,此为回调。在别的语言里面也有回调,只不过在C里是用函数指针实现的,据我所知,在.NET里类似的东西是delegate。回调不仅仅存在于库函数和客户代码之间,说得宽一点,只要是低一层的函数接受一个来高一层的函数并反过来调用它,就是回调。

C++的虚函数则是C++类的层次关系中的东西。在C++里有一种用法是定义一个抽象的基类作为接口,然后定义不同的派生类去实现这个接口,好让使用这个接口的程序能和具体实现解耦。但是在这种层级关系中,并没有“违反”常规层次关系的现象存在。比如,定义了输出流类,然后定义一个文件流的子类,在我们去调输出流的虚函数时,实际调了文件流类的实现,所以在概念上,回调和虚函数是不同的,各自有应用场合。

对于面向对象的系统来说,也是有“回调”的,只是不只是函数可以回调,而是整个类也可以“回调”,那就是所谓的“控制反转”。

一般来说,库提供的类是用来服务客户代码的,我们可以使用他们提供的功能,比如,排序、管理内存等等。控制流由我们客户代码牢牢的把握着。所谓控制反转,就是在某些场合下,控制流其实是由库/框架定义好的,在这个大模板的环境下,允许客户提供几个自己的类给框架,框架在合适的时候调我们的类。比如,对于某些类型的服务器程序,启动、生成线程、读取配置、接受连接、管理数据库、关闭服务,都是可以由框架事先统一实现的,而具体提供什么服务才是需要自己实现的。这时候,就使用这种控制反转,常规的流程由框架实现,等到需要提供具体的业务逻辑了,才来调我们的类里面的功能。在这种语境下,其实可以看成是“回调”思路的升级。在控制反转的时候,框架可能会实现定义一个抽象接口,由客户自己去提供实现,虽然实现的机制可能也是抽象类以及虚函数,但是主导的思想其实是控制反转。广义的看,qsort不也是一个模版吗,我们提供的比较函数不也是客户在模版下提供的自定义行为吗。

所以,我的看法是,回调的思想和虚函数的思想是不同的概念,使用场合是不一样的,虽然有类似的地方,但是不要搞混比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值