VB6 Vb.net 为什么要用委托,为什么要用事件?个人理解.

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

 

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

 

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

 

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

 

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

 

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

========

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

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

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

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

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

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

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

=========

 

posted on 2021-11-30 16:23  boy8199  阅读(247)  评论(0编辑  收藏  举报