VB6实现真正的继承【转】
来源:互联网 发布:阿里云 负载均衡 使用 编辑:程序博客网 时间:2024/06/05 00:25
代码重用的许多(内部)方面
有两种主要的代码重用窗体—二进制和源代码。二进制代码重用,是通过创建和使用一个对象来实现的,而源代码重用,则是通过继承来实现的— Visual Basic 不支持。(源代码重用也可以通过复制和修改源代码来实现,但这种技术没有什么新意,而且存在许多人所共知的问题。)
Visual Basic 已成为二进制代码重用的先驱—控件就是典型的例子。通过将控件的实例放置到窗体上就可以重用该控件中的代码。这被称为包含(containment) 关系或者具有 (has-a) 关系;也就是说,该窗体包含或者具有CommandButton。
详细信息 包含关系在本章后面的“对象模型”作了讨论。
委派给实现的对象
Implements 提供了代码重用的一种强有力的新途径。可以实现一个抽象类(就象在“创建和实现接口”中所讨论的那样),或者也可以实现一个全功能类的接口。可以在外部对象(即,实现内部对象接口的那个对象)的 Initialize 事件中创建内部对象(即,所实现的对象)。
就象在“创建和实现接口”中所提到的那样,接口就象契约一样—必须在外部对象的类模块中实现内部对象接口的所有成员。不过,在委派内部对象的属性和方法为代表方面,可以有很多选择。在一个方法中,可能直接委派一个内部对象为代表,传递未更改的参数,而在另一种方法中,可能执行在调用该内部对象之前自己的部分代码,在第三种方法中仅仅执行自己的代码,而完全忽略内部对象!
例如,假设有一个 OneManBand 类和一个 Cacophony 类,这二者都产生声音。希望把 Cacophony 类的功能添加到 OneManBand 类中,并重用 Cacophony 类方法的一些实现。
'OneManBand 实现 Cacophony 接口。
Implements Cacophony
'保存引用的对象变量。
Private mcac As Cacophony
Private Sub Class_Initialize()
'创建对象。
Set mcac = New Cacophony
End Sub
现在,就可以在“对象”下拉菜单上选择 Cacophony,然后为 Cacophony 接口的方法获得过程模板。为了实现这些方法,可以委派给 Cacophony 对象。例如,Beep 方法可能看起来如下所示:
Private Sub Cacophony_Beep(ByVal Frequency As Double, _
ByVal Duration As Double)
'委派给内部的 Cacophony 对象。
Call mcac.Beep(Frequency, Duration)
End Sub
上面的实现是非常简单的。外部对象 (OneManBand) 直接委派给内部对象 (Cacophony),不作任何更改即可重用 Cacophony 对象的 Beep 方法。这是一件好事,但仅仅只是个开端。
Implements 语句对于代码重用来说,是一个非常强大的工具,因为它给予很大的灵活性。可能想更改 OneManBand 类的 Beep 方法的效果,方法是在对内部 Cacophony 对象的调用之前(或之后),插入自己的代码:
Private Sub Cacophony_Beep(ByVal Frequency As Double, _
ByVal Duration As Double)
'撞击每一件东西升高八度。
Frequency = Frequency * 2
'基于 OneManBand 类的另一个属性,即 Staccato,
'分割每个嘟嘟声的持续时间。
If Staccato Then Duration = Duration * 7 / 8
Call mcac.Beep(Frequency, Duration)
'甚至可以调用 OneManBand 的其它方法。
If Staccato Then Pause(Duration * 1 / 8)
End Sub
对于这些方法来说,实现可能会直接委派内部 Cacophony 对象为代表,而对于另外一些来说,可能在委派之前或之后插入自己的代码—或者甚至完全忽略委派,而完全用自己的代码来实现一种方法。
因为 OneManBand 类实现 Cacophony 接口,所以可以将它和调用该接口的任何音乐应用程序一起来使用。其实现细节可从调用应用程序处隐藏起来,但是结果发出的声音都是自己的。
注意 COM 提供了另一个机制进行二进制代码重用,该机制叫凝聚。在集合中,无更改地重用一个完整的接口,而且该实现是由被凝聚的类的一个实例所提供的。Visual Basic 不支持这种代码重用的窗体。
这样一来不冗长乏味吗?
写委派代码的确可能变得冗长乏味,如果大部分外部对象的属性和方法,只是简单地直接委派给相对应的内部对象的属性和方法的时候,尤其是这样。
如果有 Visual Basic 专业版或企业版,就可以使用“Visual Basic 扩展性”模型,创建自己的委派向导,使任务自动化,类似于专业版和企业版中的“类向导”一样。
详细信息 在部件软件中多态和多重接口的使用,在《部件工具指南》中,“创建 ActiveX 部件”中的“部件设计的一般准则”中作了讨论。
关于“扩展性模型”的使用,在《部件工具指南》中的“用外接程序来扩展 Visual Basic 环境”中作了文档说明。
原文参看:http://bbs.gameres.com/showthread.asp?threadid=114535&page=1
»下一篇:移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记
posted on 2011-08-31 18:40 深蓝医生 阅读(510) 评论(0)编辑 收藏
- VB6实现真正的继承【转】
- VB6 如何实现多重接口继承
- VB6.0设计真正实用的TreeView控件
- js真正的原型继承
- 网贴:打造最专业的VB6服务器应用开发-VB6真正的多线程
- VB6.0接口,转转转 (用VB6.0接口实现INI文件的读取组件)
- VB6下接口的实现
- VB6中的面向对象编程---实现类继承
- VB6中的面向对象编程---实现类继承
- 【VB6】实现VB6中类的静态方法
- 【VB6】实现VB6中类的静态方法
- vb6.0实现soap的客户端
- VB6 实现文本框的自动完成功能
- VB6中模拟按钮的实现
- VB6实现简单的扫雷小游戏
- vb6不支持多重接口继承
- VC+CrystalReport的真正实现
- 真正的健康,真正的财富[转]
- 使用ubuntu1404搭建GnuRadio环境
- 跳格子问题
- 从一个网页到一个app--一个HttpUrlConnect工具类模板(二_2)
- 各hbase版本对hadoop各版本的支持情况
- AndroidStudio 快捷键
- VB6实现真正的继承【转】
- 腾讯深度学习系列——深度学习及并行化实现概述
- 指针与结构体
- android权限大全
- MacBook推荐使用软件
- 第十周-阅读程序
- Java Jersey2使用总结
- android线程间通信和主线程更新ui
- shapfile中文读取乱码