zoukankan      html  css  js  c++  java
  • VB6 Vb.net 为什么要用委托,为什么要用事件?个人理解.

    前面写了一些自己的体会,最近又思考了一下,委托和事件的起因. 再写一下.

    我认为 让人迷惑的 就是 为什么要使用委托,为什么要使用事件.

    之前我讲了 它们是反向调用,包括回调函数也是.

    这里 在讲一下 它们的重点:  谁调用谁的问题,是关键.

    关键 就是 谁是谁的事件,谁是谁的委托,谁是谁的回调.   一定要分清楚.

    举一个 更直观的例子, 不要 同一个程序 ,我们这次来举一个 插件的例子

    你有一个程序A使用了一个插件或 dll 或 ActiveX--插.dll, 

    1、现在  插.dll里面有一个函数:[插.录入] 需要 程序A来输入一些信息,  怎么录入? 这时候 需要一个函数,它就被成为 [插]的回调函数.

    2、插.dll里面进行了一下操作,需要通知程序A,"你的快递到了",怎么通知? 这是后就需要一个函数,它被称为 事件或者委托.

    当然 事件,委托,回调,其实都是差不多的事情.

    但是 是不是 随便写呢,肯定不行,如果随便写, 那需要录入什么? 需要通知什么? 所以需要事先约定. 这个约定 就是 事件定义\委托定义\回调定义(可能没有,但你必须按照回调格式去写否则出错)

    这个定义 是 在 插.dll里面, 

    然后 在你的程序A中进行声明.声明的意思就是 :我按照 你的约定来.

    然后 就是 程序a里面 实现,

    然后 调用--是等待 插.dll来调用.

    ================================

    这样一来是不是 清晰了呢?

    关键 就是 反向调用时,你不知道 那个你需要的函数的所有者是谁.

    --只有知道使用所有者,你才能找到那个函数. 而插.dll开发时,不知道谁会使用它.

    ========

    你声明含有一个委托的类,就相当于 在该类里面做了一个预留标记,

    对该类实例化就相当于,在预留标记中记录着这个委托实现的地址,

    这样,当该类去调用实现,就找到了事件或委托的地址去执行.

    当然 你可以直接使用地址传递函数,但这样做不安全(回调函数),就类似,一个饭店,让顾客自己去取餐,但是 饭店如果不加限制,顾客自己去后厨做饭,可能出现危险.所以进行约定--委托声明

    ================================

    所以 事件\委托\回调,主要面对的 是 跨类访问,跨程序访问,它是 对象(类) 的 事件,对象(类) 的委托. 至少是个类 才能成为 对象.

    如果是同一个类,一个模块,因为 主人是已知的 所以 不需要  委托,事件.

    =========

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/MadeInChinese/p/15624787.html
Copyright © 2011-2022 走看看