zoukankan      html  css  js  c++  java
  • 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的地址 去找它.  这也是 为什么 回调地址 需要 提前传递的原因.

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

  • 相关阅读:
    如何使用pandas分析金融数据
    ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务
    人人都懂区块链#华为云·寻找黑马程序员#
    #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
    【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)#华为云·寻找黑马程序员#
    【立即报名】解码AI大杀器:华为云GPU+Tensorflow 容器实战
    Tensorflow Serving Docker compose 部署服务细节(Ubuntu)
    华为云EI人脸识别接口初探
    人人学IoT 助学思维导图
    基于netty4.x开发时间服务器
  • 原文地址:https://www.cnblogs.com/MadeInChinese/p/15617015.html
Copyright © 2011-2022 走看看