• 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

  • 相关阅读:
    CF1314G解题报告
    CF1310D解题报告
    CF1310B解题报告
    CF908G解题报告
    oracle的IMU和ora-01555
    oracle事物
    oracle中scn(系统改变号)
    oracle实例恢复之检查点队列
    oracle优化:避免全表扫描(高水位线)
    关于oracle中in和exists的区别
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/2161229.html
Copyright © 2020-2023  润新知