zoukankan      html  css  js  c++  java
  • Vb6 VB.net 事件 委托 接口 继承 多态 的理解

    作为一个业余自学编程爱好者,在vb6 的事件 上,我一直有一个疑惑: 事件的引发 和 函数调用是相同的. 为什么还要使用事件?

    直到 到后来 看了 vb.net 的委托,我才理解. 事件 就是 一种 委托,

    它是 为了 逆向调用--

    当一个类 声明以后,它会在 内存里 建一个记录, 当实例化以后 ,他会得到 内存的分配, 所有的函数 的入口, 会 得到一个 地址--类似房间号.类的作用就是 为了封装代码,所以不会让你修改类里的代码. 

    但是 有些 操作 可能需要 根据实际情况 去修改 ,这就是 外部委托. 这里 就 出现了上面 提到的 未知对象问题. 

    Form1窗体 里面有一个 函数func1, C1是一个类Class1的一个实例 

    正常的函数调用是 调用 Form1.func1, (a对象已知,func1已知)

    而 事件是 C1要调用 Form1 的func1 ,  可是 你写程序Class1时,你不知道调用(声明)Class1 的对象的名称(Class1的爹x) 是不是Form1,  Form1 里面 有没有 func1 (有没有实例化的func1), (func已知, x 对象 是未知)

    或者 做一个比喻  父类和子类,    父类 能看到子类,可以随意调用 子类的函数, 但是 子类呢,如果没人告诉它 ,它爹(妈)是谁,它就不知道 它是谁的儿子, 子类要调用父类的函数,必须先知道自己的爹是谁,或者通知爹来告诉它. 再比喻 就是 电话来点显示, 如果没有来电显示,接电话的就不知道 谁打来电话的,就无法回电.

     你在一个类中执行代码, 实例是谁,你不知道, 所以 你需要 在 类里面 做一个 标记,让用户 把这个 操作代码的 地址 告诉你,这就是委托或者说是事件.

    vb6的话,你可以看一下 事件调用的函数名称 Form1_Size ,其中的 form1 是实例,size 是 类内的一个事件, 而这个事件需要用户类外去实现, 但它的引发 确是 由 类内实现的.

    所以 这个关键就是 类内 和 类外,""跨类引发"" 才会用到事件或委托==  有网友总结 事件 没有返回值. 事件是 sub ,委托 可以是sub 也可以是function

    '---------------'

    接口和事件 有区别吗

    个人理解, 接口 主要用在 统一标准上面,前提是 继承

    有一个 基类 实现一定的功能, 一些细节 需要 用户自己实现. 但是 为了 统一维护 用了相同的 名称.

    比如说 文件管理的基类负责存储文件到指定的目录,下面要实现 图片类存储,影音类存储,文本类存储.

    我们 可以使用函数 select case 去实现这个功能,但是 如果 程序很大 很多代码, 会出现大量的交叉,就会导致 维护困难.

    我们在基类 建立 一个接口(或者叫模板) "存储"

    子类里面 去实现 这个 存储, 这样可以把 程序 变成 独立的部分 进行开发,同时实现了 基类的复用,实现了某些多态.

    再举例子, 一个游戏,有各种招式, 都是 打 ,但是 不同的角色打 的招式不同, 你生成一个人物,然后调用 人物.打, 还是同样的问题, 使用 select 这是顺序化操作, 所有代码夹杂在一起,难以维护和同步开发,而使用接口 可以分开开发和维护., 我们开发了 人物.打,  实际实现时 是调用 战士.打 /射手.打,   代码 人物1 as 战士,  这时 你用人物1.打,就直接调用了 战士.打, 这样可以 做到 修改 战士 而不用修改 实现的代码,做到了代码统一.

    -------一段官方文字,这里提到了一个思路,就是 接口固定 可以让其他程序 更好的对接,只要你知道他的基类是谁,你就能去调用他固有的方法和属性. 

    由于其他常用技术的局限性,例如使用基于类的引用和实现继承,业界采用了基于接口的编程。用户定义的接口给应用程序设计和编程带来了新的复杂性,但它们的价值在大型应用程序中很容易衡量。在达尔文的意义上,基于接口的编程使软件更适合生存。接口使您的代码更易于重用、维护和扩展。

    COM 完全基于基于接口的编程。COM 需要接口和实现的正式分离——也就是说,它要求客户端专门通过接口引用与对象进行通信。这确保客户端永远不会在提供对象的类上建立依赖关系。这允许 COM 程序员修改他们的目标代码而不必担心破坏客户端代码。COM 客户端可以从对象获取运行时类型信息。COM 客户端总是可以查询一个对象并询问它是否支持特定的接口。如果不支持请求的接口,客户端可以发现这一点并优雅地降级。这让程序员可以独立地修改组件和应用程序。较旧的客户端和较旧的对象可以与较新的客户端和较新的对象协调工作。

    ====

    所以呢 接口\接口 ,主要就是为了对接的,为了统一标准. 因为只要做了接口 那就必须 在代码中 显式的实现该接口函数,哪怕是空函数,这样只要遵循该接口,就可以调用该段代码而不会出错.

    '============================'

    不讲道理,不讲设计理念,不讲要解决的问题,你永远无法理解某项技术产生的原因.也就 无法真正的掌握和灵活运用某项技术.

    希望各位网友 交流自己观点,

  • 相关阅读:
    win10下安装基于caffe的 Faster-Rcnn
    Caffe学习系列
    Caffe 分类问题 Check failed: error == cudaSuccess (2 vs. 0) out of memory
    Windows 10下安装配置Caffe并支持GPU加速(修改版)
    Python 基础语法
    Halcon 彩色图片通道分割处理
    halcon 特征测量
    川崎机器人c#通讯(转)
    Halcon 2D测量
    Halcon 1D测量
  • 原文地址:https://www.cnblogs.com/MadeInChinese/p/15571396.html
Copyright © 2011-2022 走看看