当前位置: 首页 > news >正文

VB6实现真正的继承【转】

MSDN中有.

 


代码重用的许多(内部)方面


有两种主要的代码重用窗体—二进制和源代码。二进制代码重用,是通过创建和使用一个对象来实现的,而源代码重用,则是通过继承来实现的— 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



    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2011/08/31/2161229.html,如需转载请自行联系原作者


相关文章:

  • WPF 窗口
  • 三菱数控CNC系统G代码M代码大全
  • Java 注释
  • ansible debug模块学习笔记
  • idea常用快捷键
  • MySql 用户管理 中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):...
  • 迎双11十周年,OceanBase 2.0挑战新巅峰
  • PHP 字符串
  • 文本监控 :oninput onchange onpropertychange 的区别
  • 201621123057 《Java程序设计》第7周学习总结
  • 《Netkiller Blockchain 手札》Hyperledger Fabric Java SDK Demo
  • xml文件里 用js语句获取 当前时间
  • 基于 ElasticSearch 搜索服务的简易 API 调用
  • SCCM 2016 使用PXE 部署操作系统(五)
  • Java如何获取系统cpu、内存、硬盘信息
  • $translatePartialLoader加载失败及解决方式
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Docker: 容器互访的三种方式
  • Effective Java 笔记(一)
  • LeetCode29.两数相除 JavaScript
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • vue:响应原理
  • vue--为什么data属性必须是一个函数
  • 大主子表关联的性能优化方法
  • 给github项目添加CI badge
  • 类orAPI - 收藏集 - 掘金
  • 前端技术周刊 2019-01-14:客户端存储
  • 驱动程序原理
  • 项目实战-Api的解决方案
  • 移动端 h5开发相关内容总结(三)
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma预处理命令
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (9)STL算法之逆转旋转
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)甲方乙方——赵民谈找工作
  • (转)原始图像数据和PDF中的图像数据
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @Bean有哪些属性
  • @EventListener注解使用说明
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ACTF2020 新生赛]Upload 1
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn