前面写了一些自己的体会,最近又思考了一下,委托和事件的起因. 再写一下.
我认为 让人迷惑的 就是 为什么要使用委托,为什么要使用事件.
之前我讲了 它们是反向调用,包括回调函数也是.
这里 在讲一下 它们的重点: 谁调用谁的问题,是关键.
关键 就是 谁是谁的事件,谁是谁的委托,谁是谁的回调. 一定要分清楚.
举一个 更直观的例子, 不要 同一个程序 ,我们这次来举一个 插件的例子
你有一个程序A使用了一个插件或 dll 或 ActiveX--插.dll,
1、现在 插.dll里面有一个函数:[插.录入] 需要 程序A来输入一些信息, 怎么录入? 这时候 需要一个函数,它就被成为 [插]的回调函数.
2、插.dll里面进行了一下操作,需要通知程序A,"你的快递到了",怎么通知? 这是后就需要一个函数,它被称为 事件或者委托.
当然 事件,委托,回调,其实都是差不多的事情.
但是 是不是 随便写呢,肯定不行,如果随便写, 那需要录入什么? 需要通知什么? 所以需要事先约定. 这个约定 就是 事件定义\委托定义\回调定义(可能没有,但你必须按照回调格式去写否则出错)
这个定义 是 在 插.dll里面,
然后 在你的程序A中进行声明.声明的意思就是 :我按照 你的约定来.
然后 就是 程序a里面 实现,
然后 调用--是等待 插.dll来调用.
================================
这样一来是不是 清晰了呢?
关键 就是 反向调用时,你不知道 那个你需要的函数的所有者是谁.
--只有知道使用所有者,你才能找到那个函数. 而插.dll开发时,不知道谁会使用它.
========
你声明含有一个委托的类,就相当于 在该类里面做了一个预留标记,
对该类实例化就相当于,在预留标记中记录着这个委托实现的地址,
这样,当该类去调用实现,就找到了事件或委托的地址去执行.
当然 你可以直接使用地址传递函数,但这样做不安全(回调函数),就类似,一个饭店,让顾客自己去取餐,但是 饭店如果不加限制,顾客自己去后厨做饭,可能出现危险.所以进行约定--委托声明
================================
所以 事件\委托\回调,主要面对的 是 跨类访问,跨程序访问,它是 对象(类) 的 事件,对象(类) 的委托. 至少是个类 才能成为 对象.
如果是同一个类,一个模块,因为 主人是已知的 所以 不需要 委托,事件.
=========