编程基础——C/C++,Java,ObjC讨论回调模式
什么是回调?
因为它是从C开始进入编程世界。术语改只是口。叫习惯了。java里通常叫listener(监听器)。C/C++里通常叫callback(回调),ObjC里面叫delegate(托付)
回调就是调用事先设置一个上下文数据(它可能是某个消息值,可能是某个函数。可能是某个对象)到某个负责处理数据的对象或者代码里。
然后開始运行这个处理过程,这个处理过程处理完了之后。会依据处理的结果将之前设置的相应的上下文数据反馈给你。
举个样例吧。比方我有个函数是下载一个http的图片资源。
在调用这个函数之前,我先告诉这个函数。假设下载成功了。你就给我发一个通知1,假设失败了,就给我发一个通知0(当然是返回0,1最简单啦。可是假设是异步的呢)。回调的形态多种多样。各种方式的都有,可是本质上就是一个模块的代码通知告知还有一个模块某个结果,某个状态。某个进度。
C语言里面,因为仅仅有函数。没有对象。所以C语言的回调经常使用两种:1、消息通知。2、回调函数。
对于消息通知来说。须要一个消息循环。
当进入某个状态或者处理完某个人物的时候,发送一个通知到消息循环,在负责处理的地方。等待这个消息就能够了。
实际开发中用到消息循环的地方有:win32API/MFC 的消息机制,android的handler机制,都是消息回调方式。
对于函数回调来说。运行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();
- else
- f();
- }
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 <NSObject>
- -(void) callbackFunctionS;
- -(void) callbackFunctionF;
- @end
- -(void)A:(id<XXXXDelegate>)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");
- }
- }
不同语言,不同平台湾。基本上相同的。好想法。设计理念可以学习。
版权声明:本文博主原创文章,博客,未经同意不得转载。
编程基础——C/C++,Java,ObjC讨论回调模式的更多相关文章
- java并发编程基础 --- 7章节 java中的13个原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量 i=1,A线程更新 i+1,B线程也更新 I+1,经过两个线程的操作之后可能 I不等于3,而是等于2.因为A和B线程更 ...
- Java入门——(1)Java编程基础
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- (翻译)理解Java当中的回调机制
原文地址:http://cleancodedevelopment-qualityseal.blogspot.com/2012/10/understanding-callbacks-with-java. ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- Java并发编程--基础进阶高级(完结)
Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
随机推荐
- Python的TkinterButton做为父窗口
#-*-coding:utf--*- import Tkinter,time,tkMessageBox,sys,BeBigModule class MainFrame: def __init__(se ...
- jQuery cxSelect 多级联动下拉菜单
随着电商热门,这种多层次的互动更充分地体现在下拉菜单,最明显的是多级联动地址下拉选择,因此,这里是一个简单的分享 jQuery cxSelect 多级联动下拉菜单 cxSelect 它是基于 jQue ...
- 逆向project第004篇:令计算器程序显示汉字(下)
一.前言 钩子技术是一项很有有用价值的技术.在Windows下HOOK技术的方法比較多,使用比較灵活,常见的应用层的HOOK方法有Inline HOOK(详见<反病毒攻防研究第012篇:利用In ...
- java反射中Method类invoke方法的使用方法
package com.zsw.test; import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetExcep ...
- linux下多进程的调试
linux下多进程的调试: (1)follow-fork-mode set follow-fork-mode [parent | child] ---- fork之后选择调试父进 ...
- Codeforces Round#297 div2
B: 题意:给定一个字符串,然后给定m个数字 对于每个数字ai的含义是,将ai到n-ai+1的字符串给翻转一遍. 要求输出m次翻转之后的字符串. 想法就是判断第i个位置的字符是翻转了奇数次,还是偶数次 ...
- 软件測试系统文章(文件夹&链接在此)
前言 我会在此账号上写一系列关于软件測试的文章,故在此置顶软件測试系列文章的文件夹和链接,以方便大家阅读! 文件夹 软件測试系列之入门篇(一) 软件測试系列之了解篇(二) 软件測试系列之黑白盒(三) ...
- MySQL Windows ZIP 免费安装和启动设置
MySQL Windows ZIP免安装版,设置和启动的过程事实上挺麻烦的.以下一步一步介绍使用的过程: 1.下载Windows (x86, 64-bit), ZIP Archive: 2.解压zip ...
- wireshark教程
Wireshark世界上最流行的网络分析工具. 这个强大的工具能够捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与非常多其它网络工具一样.Wireshark也使用pcap network ...
- Ceph更多Mon 更多mds
1.当前状态 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdWpfbW9zcXVpdG8=/font/5a6L5L2T/fontsize/400/fill ...