vb6 vba vb.net 回调函数是什么.个人理解


个人理解,希望能帮到初学者. 欢迎各位老师讨论指点.

广义的讲: 是a函数参数 通过b函数指针(地址)调用 另一个函数b.  这个概念 有些大了, 我这里只说 狭义的.
狭义的讲:系统回调函数 是 windows编程里的概念,是设计思路, 它是一个预留的接口或者程序入口.是一个占位.

回调,谁调谁,这个要搞清楚. 系统回调,说明 是 在你的程序里面, 系统 调用你的代码.

因为windows是消息驱动, 就是说 程序和操作的沟通 是通过 "消息"来进行.那么这个沟通 就有一个 固定的模式. 比如说,谁接受消息,谁处理消息.

就像美国生活里,在门口有一个信箱,邮递员投一个信到信箱,爸爸早起收信,然后根据信的内容在家里面进行一系列的操作.

这个信箱 就是 回调地址. 如果没有这个地址 系统的信息 就无法被程序获得, 我们也就没法进行一些 干预系统的操作.
比如 通知,洒水车 要来 免费给家里浇草坪,爸爸收到消息(特定消息),一看,别呀,我刚浇了草坪,再浇水涝死了,所以 爸爸出手把它拦截了,阻止了浇草坪.

在vb之中,有些事件已经可以处理,比如鼠标移动点击,有一些被屏蔽了,如果你希望处理,那就要通过系统的API注册你需要处理的消息--你希望有什么事,让邮递员投递到信箱的(邮递员不是有消息就投,同时有选择的.有一些消息vb自动给你处理了).
到这里 你可能 有了一点感性的认识,我把它 再狭隘一下-- 它的重点是 插入系统.或者说是 由 第三方去调用 (启动函数\被调用回调函数\第三方函数),插入第三方,等待第三方去调用.

系统消息 1->2->3->4->5 ->1不断的产生.   你突然对 鼠标滚轮滚动感兴趣,你就告诉系统,如果鼠标滚轮滚动告诉我一声,我在xxx等你,然后 系统 就把你刚才的话 记下来了(在某个系统消息处理必经之路上占位,插入消息处理程序中), 就在消息循环的时候检查有没有 "鼠标滚轮滚动" 这个消息,如果有,就转到了 xxx去处理,你可以决定 消息继续还是终止传递. 这里 就是 系统 告诉你 "滚动来了",而不是 你一遍一遍的去查,(翻译成回调的理由).


当然 个人也可以自己写一个 函数称为 回调. 但这样的称呼就有点 混乱. 我这就主要指 系统回调.

如果是 自定义函数,那么 它应该也是 1\设置回调函数地址给 某一个程序的某个第三方. 2\当某一个事件发生时,(重点)第三方调用回调函数执行.否则 你都知道谁要调用谁,没必要回调.
这里的xxx的执行中 不是  你的程序,而是系统. 这里 就涉及了 调用者的问题. 如果是 类 理论上需要 已知的类.xxx 这种方式去调用. 而现在 是 不知谁调用的(可能是系统,也可能是其他程序),.....这是需要回调的原因.
当然 这个回调函数 会根据 处理的内容不同 需要固定的 格式(类似于事件)

或者说 只要这个函数是 硬插到 系统消息处理之中, 就可以称之为 回调.因为 它侧重于 回拨--就是由系统调用.

这 有点像 其他一些语言的 继承重写 ,但又不完全相同.================
补充一下 :上面说的第三方, 也可以 理解成 两方: 1本程序 本类 2\另一个程序 另一个类

类A 调用 类B中的函数Bs1, 而 类B 需要调用了 类A中的  函数As1(需要As1 进行一些差别化的工作),........(如果理解成三方: A类的某个启动函数\ Bs1 第三方\As1--回调函数)

但是 这个过程 是个单向的, 类A是调用者,类B是被调用者, 类B它不知道谁调用的它,所以 它无法 用 类A.As1的方式调用函数As1,因为它写代码时 不可能知道是类A调用的它,也可能是 类C D E F

比如一个没有来电显示的 客服B,接到了 客户A的电话,要进行售后维修程序活动,这就需要客户A提供一个地址.

所以 类B 只能通过 类A中 As1的地址 去找它.  这也是 为什么 回调地址 需要 提前传递的原因.

理解了这个,也就 能同时更好的 理解 事件和委托.
回调函数基本就是为了实现异步的(事件调用,有事才通知你) 和 反向调用(你不知道谁会调用你,但你需要调用者干点什么,这里的你 是指 第三方,比如前面说的系统,系统执行被插入了一段代码,执行后 继续回到原来的代码. "谁"变成我们编写的代码 ),也不是绝对,这样说是为了更好的理解为什么 要用回调.