博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程基础——C/C++,Java,ObjC讨论回调模式
阅读量:6637 次
发布时间:2019-06-25

本文共 3483 字,大约阅读时间需要 11 分钟。

什么是回调?

因为它是从C开始进入编程世界。术语改只是口。叫习惯了。java里通常叫listener(监听器)。C/C++里通常叫callback(回调),ObjC里面叫delegate(托付)

回调就是调用事先设置一个上下文数据(它可能是某个消息值,可能是某个函数。可能是某个对象)到某个负责处理数据的对象或者代码里。

然后開始运行这个处理过程,这个处理过程处理完了之后。会依据处理的结果将之前设置的相应的上下文数据反馈给你。

举个样例吧。比方我有个函数是下载一个http的图片资源。

在调用这个函数之前,我先告诉这个函数。假设下载成功了。你就给我发一个通知1,假设失败了,就给我发一个通知0(当然是返回01最简单啦。可是假设是异步的呢)。回调的形态多种多样。各种方式的都有,可是本质上就是一个模块的代码通知告知还有一个模块某个结果,某个状态。某个进度。

C语言里面,因为仅仅有函数。没有对象。所以C语言的回调经常使用两种:1、消息通知。2、回调函数。

对于消息通知来说。须要一个消息循环。

当进入某个状态或者处理完某个人物的时候,发送一个通知到消息循环,在负责处理的地方。等待这个消息就能够了。

实际开发中用到消息循环的地方有:win32API/MFC 的消息机制,androidhandler机制,都是消息回调方式。

对于函数回调来说。运行A函数的时候。函数參数里传入S函数和F函数的指针,假设A运行成功了。最后在A里面调用S,假设A运行失败了。在最后A里面调用F

比方C里面的回调大概就是以下这种。

void S(){}void F(){}typedef (void*)() callback ;void A(callback s, callback f){if(成功)s();elsef();}

C进化到C++之后,回调的方式就好多了,由于有对象了。管理对象总是比管理单个函数方便的多,由于对象能够同一时候关联函数和数据。

比方C++ 对象方式的回调样子大概像以下这样

struct CPPCallback{virtual void callbackFunctionS();virtual void callbackFunctionF();}void A(CPPCallback* calback){	if(成功)		calback-> callbackFunctionS();	else		calback-> callbackFunctionF();}

使用对象指针回调会方便非常多,由于CPPCallback一般是纯虚类,由实际场景中的某个类来实现。而且对象指针回调更加符合面向对象的模式,越是高级的语言。越面向对象,假设和这个趋势相违背,那势必用起来是不那么方便的。C++同一时候也能够使用C的回调方式,就不在举例了。

java的回调方式。是依照 触发器 +监听器的理念设计的。本质和C++那个没什么差别。叫法不一样。

interface JavaListener{	public void callbackFunctionS();	public void callbackFunctionF();}void A(JavaListener listener){	if(成功)		listener.callbackFunctionS();	else		listener.callbackFunctionF();}

java官方的代码以及开源码里面,一般出现的都是这样的回调方式(android handler那种除外),java全然面向对象所以不会出现单独的函数回调。

监听器 + 触发器的叫法,我个人是很喜欢的。

以至于个人在开发 C++代码,ObjC代码,其它全部语言的程序的时候,都沿用了Java里面的叫法。特别是ObjC的托付授权叫法。实在是拗口,不好理解。

ObjC的回调方式。官方的叫法叫托付(delegate)。可是ObjC的回调的详细形式却非常灵活,因为ObjC也面向对象,所以它肯定能够支持java这样的回调。

可是ObjC还支持一种 对象指针 +函数名的轻量级回调,后者在代码书写量上面。反而要简单很多。

比方ObjC中类似java的那种回调方式

@protocol XXXXDelegate 
-(void) callbackFunctionS;-(void) callbackFunctionF;@end-(void)A:(id
)delegate{ if(成功) [delegate callbackFunctionS]; else [delegate callbackFunctionF];}

ObjC另外一种更简单的回调。另外一种回调不用定义protocol

@class-implemention SomeClassA //如果某个类的实现文件-(void) callbackFunctionS{}-(void) callbackFunctionF{}-(void)A:(id)delegate withS:(SEL)funS withF:(SEL)funF{	if(成功)		[delegate performSelector:funS withObject:nil]; 	else		[delegate performSelector:funF withObject:nil]; }-(void)callA //演示调用A的情况{	[self A:self withS:@selector(callbackFunctionS) withF:@selector(callbackFunctionF)];}@end

仅仅要调用A第一个參数传入的对象 delegate的类里面有名字叫callbackFunctionS和叫callbackFunctionF的函数就可以。

ObjC的类型 SEL,实际上就是一个 char*类型。它的原理是通过字符串去查找某个函数,然后再某个对象上运行这个函数。

主要的这三种语言的回调方式就是这种了,假设取长补短,其它语言借鉴一下思路,java语言里也能够实现ObjC的另外一种回调方式。

C++则比較麻烦,由于C++不直接支持反射。仅仅能通过类似微软的COM模式,模拟实现。微软的COM也是个不错的东西。火狐浏览器的底层架构。就是用的XPCOM(基于COM思路设计的)。

C++怎样反射。能够參考我的还有一篇文章。

java的反射机制。比ObjC更彻底,由于java是纯解释性语言。ObjC是半解释语言。

所以java实现ObjC另外一种回调方式,so easy

完整代码例如以下:

package com;import java.lang.reflect.Method;public class Main2 {public static void main(String[] args) throws Exception{	new Main2().run(); }public void callbackFunctionS() {	System.out.println("callbackFunctionS");}public void callbackFunctionF() {	System.out.println("callbackFunctionF");}public void A(Object obj, String funcS, String funcF) throws Exception{	Class clz = obj.getClass() ;	Method methodS = clz.getMethod(funcS, null);	Method methodF = clz.getMethod(funcF, null); 	if(true) //成功		methodS.invoke(obj, null);	else		methodF.invoke(obj, null);}public void run() throws Exception{ 	this.A(this, "callbackFunctionS", "callbackFunctionF");}}

不同语言,不同平台湾。基本上相同的。好想法。设计理念可以学习。

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
ioS开发知识(二十三)
查看>>
Python第三周 学习笔记(1)
查看>>
redhat7.2搭建OwnCloud 10搭建私有云,搭owncloud的环境是 LAMP
查看>>
openstack概念架构
查看>>
《阿里技术之瞳》笔记
查看>>
编译安装cmake
查看>>
yum安装java8配置环境变量
查看>>
find命令总结
查看>>
logstash+es+kibana+redis搭建(之前我看别人文档有点错误,我自己尝试搭建修改)...
查看>>
c++实现电子词典
查看>>
Python学习笔记__10.5章 分布式进程
查看>>
第十八讲 任务延时队列
查看>>
nginx通过url跳转到另外的一个url上
查看>>
Redis(四)、Redis数据库主从复制
查看>>
获取当前IP地址,跳转到对应城市网站。
查看>>
参加高项6期培训感受
查看>>
有关冗余或者备份的那些协议(1)
查看>>
Entity Framework之深入分析
查看>>
python处理excel文件
查看>>
远程日志管理
查看>>