各位朋友:
    请问一下VB中implements以及使用方法?

解决方案 »

  1.   

    implements的作用是为类添加接口,然后在类中自己编码实现该接口
      

  2.   

    MSDN:
    创建和实现接口
    如上面“Visual Basic 是如何提供多态的”中所解释的,所谓接口,就是一组属性和方法。在下面的代码示例中,将创建一个 Animal 接口,并在两个类— Flea 和 Tyrannosaur 中实现它。创建该 Animal 接口的方法是:将一个类模块添加到工程中,将它命名为 Animal,并插入到下面的代码中:Public Sub Move(ByVal Distance As Double)End SubPublic Sub Bite(ByVal What As Object)End Sub注意,在这些方法中并没有任何代码。Animal 是一个抽象类,不包含实现的任何代码。抽象类不是用来创建对象的—其用途是为添加其它类中的接口提供模板。(尽管,已经证明,有些时候实现一个非抽象类的接口是有用的;这将在本节主题的后面进行讨论。)注意   确切地说,一个抽象的类是不能从中创建对象的类。从 Visual Basic 的类中总是可以创建对象的,即使它们不含有代码,它们也不是真正抽象的。现在,就可以添加另外两个类模块了,这两个类模块一个叫 Flea,另一个叫 Tyrannosaur。为了在 Flea 类中实现 Animal 接口,要用到 Implements 语句:Option Explicit
    Implements Animal一旦将这行代码添加进去,就可以单击代码窗口中左边(“对象”)下拉菜单。其中一个登录项将是 Animal。当选择了它时,右边(“过程”)下拉菜单上将显示 Animal 接口的方法。依次选择每种方法,可为所有的方法创建空白过程模板。这些模板将具有正确的参数和数据类型,就象在 Animal 类中所定义的那样。每个过程名都将以 Animal_ 前缀来标识该接口。重点   一个接口就象一个契约。实现接口后,当调用该接口的任何属性或者方法时,一个类已经约定好要作出反应。因此,必须实现接口的所有属性和方法。现在,就可以将下面的代码添加到 Flea 类中了:Private Sub Animal_Move(ByVal Distance As Double)
       '(跳过多少英寸的代码,略。)
       Debug.Print "Flea moved"
    End SubPrivate Sub Animal_Bite(ByVal What As Object)
       '(吃了多少生命的代码,略。)
       Debug.Print "Flea bit a " & TypeName(What)
    End Sub可能想知道为什么这些过程被声明为 Private。如果它们是 Public,那么 Animal_Jump 和 Animal_Bite 过程将成为 Flea 界面的一部分,这样将被困在跟原先所在的同样的圈子中,将 Critter 参数声明为 As Object,这样它就可能包含一个 Flea 或者一个 Tyrannosaur。多重接口
    现在,Flea 类有了两个接口:刚刚实现的 Animal 接口—它有两个成员,以及缺省的 Flea 接口—它没有任何成员。该示例的后面,将把一个成员添加到缺省接口的其中一个。类似地,可以为 Tyrannosaur 类实现 Animal 接口:Option Explicit
    Implements AnimalPrivate Sub Animal_Move(ByVal Distance As Double)
       '(跳起多少码的代码,略。)
       Debug.Print "Tyrannosaur moved"
    End SubPrivate Sub Animal_Bite(ByVal What As Object)
       ' (拿起一磅肉的代码,略。)
       Debug.Print "Tyrannosaur bit a " & TypeName(What)
    End Sub练习 Tyrannosaur 和 Flea
    将下列代码添加到“Form1”的 Load 事件中:Private Sub Form_Load()
       Dim fl As Flea
       Dim ty As Tyrannosaur
       Dim anim As Animal   Set fl = New Flea
       Set ty = New Tyrannosaur
       '首先看一下 Flea。
       Set anim = fl
       Call anim.Bite(ty)   'Flea 叮咬 dinosaur。
       '现在轮到 Tyrannosaur。
       Set anim = ty
       Call anim.Bite(fl)   'Dinosaur 咬 flea。
    End Sub按 F8 键,单步执行代码。注意“立即”窗口中的信息。当 变量 anim 包含对 Flea 的引用时,就调用该 Flea 的 Bite 实现,同样的,对于 Tyrannosaur 来说,情况也是如此。变量 anim 可以包含对实现 Animal 接口的任何对象的引用。事实上,它只能包含对这种类型对象的引用。如果试图将一个 Form 或者一个 PictureBox 对象赋给 anim 的话,那么将会产生错误。当通过 anim 来调用 Bite 方法时,该方法是前期绑定的,因为 Visual Basic 在编译时知道,不论将什么对象赋给 anim,该对象都将有一个 Bite 方法。将 Tyrannosaurs 和 Fleas 传递给过程
    回忆一下“Visual Basic 如何提供多态?”("How Visual Basic Provides polymorphism?")中的 GetFood 过程。可以将 GetFood 过程的第 2 个版本—演示多态的版本—添加到“Form1”中,并用下面的代码来取代 Load 事件中的代码:Private Sub Form_Load()
       Dim fl As Flea
       Dim ty As Tyrannosaur   Set fl = New Flea
       Set ty = New Tyrannosaur
       'Flea 在恐龙上吃饭。
       Call GetFood(fl, ty)
       '相反的情况。
       Call GetFood(ty, fl)
    End Sub单步执行上述代码,显示作为传递给另一接口类型参数的对象引用,是怎样转换为对第二个接口(在这里是 Animal)的引用的。所发生的情况是: Visual Basic 查询该对象,看看该对象是否支持第二个接口。如果该对象支持的话,它将返回对该接口的引用,于是 Visual Basic 将返回的引用放置到参数变量中。如果该对象不支持第二个接口,将会出现错误。实现返回值的方法
    假设 Move 方法返回一个值。不管怎么说,自己知道想让 Animal 移动多远的距离,但是,各个实例不可能都移动那么远。它可能又老又弱,或者在路上可能恰好有一堵墙。可以用 Move 方法的返回值来说明该 Animal 实际移动了多远的距离。Public Function Move(ByVal Distance As Double) _
    As DoubleEnd Function在 Tyrannosaur 类中实现该方法时,把返回值赋给过程名,这跟处理任何其它 Function 过程一样:Private Function Animal_Move(ByVal Distance _
    As Double) As Double
       Dim dblDistanceMoved As Double
       '计算能弹跳多远(基于对年龄、健康状态和障碍物的
       '考虑)的代码,略。
       '该示例假设已经将结果放置到变量 dblDistanceMoved 中。
       Debug.Print "Tyrannosaur moved"; dblDistanceMoved
       Animal_Move = dblDistanceMoved
    End Function为了返回值的赋值,使用全过程名,包括接口前缀。详细信息   所实现的接口,除方法外还可以有属性。下面“实现属性”讨论了属性实现的方式上的一些不同之处。
      

  3.   

    通过接口的实现提供多态性
    部件对象模型 (COM) 的最显著的特性是对象具有实现多个接口的能力。除多态性外,多个接口还提供了增量式或渐进式开发的方法,在发生改动时不必重新编译系统中的所有部件。以由密切相关的函数组成的接口方式定义功能,就可以只实现部件所需的功能,需要时再通过实现附加的接口来扩展其功能。由于部件的新版本在添加新接口或增强接口时,可以继续提供原有的接口,这样就简化了保持兼容的问题。如果有必要,客户端应用程序的后续版本就可以使用它。继承与多态性
    如《Visual Basic 程序员指南》“用对象编程”的“多态性”所阐述的,绝大多数面向对象的编程工具通过继承来提供多态性。对小规模的开发任务来说,这是一种很有效的技术,但大规模的系统中,这种方法是有问题的。一方面,导致这些困难是由于需要对继承树深处的类作必要的改动。为了获得改动后的优点必须进行重编译。如果到发布新版本的最后期限时,重新编译失败将导致严重的后果。更严重的是,过分强调继承驱动多态性往往导致大量的资源从开发任务到前沿设计任务的转移,在最终用户可能发现─ 通过掌握的经验─ 系统是否真地完成了期望的目的之前,却没有解决积压的开发任务或缩短时间。所以,快速原型工具和快速应用程序开发 (RAD) 比 OOP 工具得到更广泛的接受。Visual Basic 与 COM
    Visual Basic 遵循 COM,强调多接口是提供多态性的一种更灵活的途径。这样,软件可以一个接口一个接口地渐进开发,而不是原来那样通过一个很长的设计过程从所有必须的先例派生。刚开始时,对象可以比较小,只具有最少的功能。随着在实践中逐渐明确该对象应该提供的功能,再不断实现这些新的功能。当实现新的接口时,继续保留原有代码以支持旧的接口。Implements 功能
    Visual Basic 使用 Implements 关键字来提供一种与辅助接口公用的方式。例如,如果工程引用了描述 IFinance 接口的类型库,则可以在类模块中包含以下代码:Implements IFinance由于类型库只包括接口,不包括实现方案,因此可以按“标准接口的实现与使用”所描述的,给 IFinance 接口的每个属性和方法增加代码。接口即协议
    为使用 Implements 功能而创建接口,就是将其永久地具体化。接口不变性是部件设计中很重要的原则,因为它保护原有的针对该接口编写的系统。当接口确实需要增强时,就应创建一个新的接口。可以称新接口为 Interface2,以说明新接口与已有接口的关系。频繁地生成新接口将使部件中充斥大量的无用接口,好的接口设计应该小而彼此独立,以尽可能减少对性能的影响。因素化接口
    确定属于接口的属性和方法的过程叫做因素化。一般而言,应使接口的功能密切相关。接口功能太多会使接口很笨拙,把功能分的太细又会增加额外的负担。例如,下面的代码调用 Velociraptor 类的三个不同接口:Public Sub CretaceousToDoList(ByVal vcr1 As _
          Velociraptor, ByVal vcr2 As Velociraptor)
       Dim dnr As IDinosaur
       Dim prd As IPredator
       vcr1.Mate vcr2
       Set dnr = vcr1
       dnr.LayEggs
       Set prd = vcr1
       prd.KillSomethingAndEatIt
    End Sub要使用 IDinosaur 和 IPredator 接口的方法,必须把对象赋给正确接口类型的变量。使用灵活数据结构的接口一般比使用固定数据类型的接口经久耐用。如上面提到的,设计接口不象创建大型继承树那样容易出错。如果以较小的接口开始,则很快就可以让系统的一部分先运行起来。以后再通过添加接口逐渐扩展这个系统,从而获得真正面向对象编程的优点。创建和使用接口的工具
    关于创建接口的技术在以下相关主题论述,在 MkTypLib 应用程序 (MIDL) 的文档中也有介绍。 使用 Visual Basic 创建标准接口   介绍 Visual Basic 提供的创建接口的工具及过程。
    标准接口的实现与使用   如何引用类型库来实现与使用接口。类型库的分布式要求。 
    详细信息   Implements 功能在《Visual Basic 程序员指南》“用对象编程”的“多态性”中详述。
      

  4.   

    在VB 模块中的Implements 是什么意思?---------------------------------------------------------------VB 5.0以后提供了一个Implements语句,它使一个类能够使用其它类的定义的过程和数据,
    这有些接近C++中的继承
    ---------------------------------------------------------------Implements 语句示例
    下面的示例说明如何使用 Implements 语句来编写多个类都可以使用的一系列声明。通过 Implements 语句共享这些声明,所有的类都不必再自己进行声明。假设有两个窗体。其中 Selector 窗体有两个按钮,Customer Data 和 Supplier Data。若要输入客户或供应商的名称及地址信息,用户就单击 Selector 窗体的 Customer Date 按钮或 Supplier Date 按钮,然后使用 Data Entry 窗体来输入名称和地址。Data Entry 窗体有两个文本字段,Name 和 Address。下面的共享声明的代码位于称为 PersonalData 的类中:Public Name As String
    Public Address As String有关处理客户数据的代码位于 Customer 类模块:Implements PersonalData
    Private Property Get PersonalData_Address() As String
    PersonalData_Address = "CustomerAddress"
    End PropertyPrivate Property Let PersonalData_Address(ByVal RHS As String)
    '
    End PropertyPrivate Property Let PersonalData_Name(ByVal RHS As String)
    '
    End PropertyPrivate Property Get PersonalData_Name() As String
    PersonalData_Name = "CustomerName"
    End Property有关处理供应商数据的代码位于 Supplier 类模块:Implements PersonalDataPrivate Property Get PersonalData_Address() As String
    PersonalData_Address = "SupplierAddress"
    End PropertyPrivate Property Let PersonalData_Address(ByVal RHS As String)
    '
    End PropertyPrivate Property Let PersonalData_Name(ByVal RHS As String)
    '
    End PropertyPrivate Property Get PersonalData_Name() As String
    PersonalData_Name = "SupplierName"
    End Property下面的代码负责处理 Selector 窗体:Private cust As New Customer
    Private sup As New SupplierPrivate Sub Command1_Click()
    Dim frm2 As New Form2
        Set frm2.PD = cust
        frm2.Show 1
    End SubPrivate Sub Command2_Click()
    Dim frm2 As New Form2
        Set frm2.PD = sup
        frm2.Show 1
    End Sub下面的代码负责处理 Data Entry 窗体:Private m_pd As PersonalData
    Private Sub Form_Load()
        With m_pd
            Text1 = .Name
            Text2 = .Address
        End With
    End Sub
    Public Property Set PD(Data As PersonalData)
        Set m_pd = Data
    End Property
      

  5.   

    我有个新问题就是如何Implements系统接口,如我要Implements IConnectionPointContainer那就可以克服VB一个事件处理器只能一个对象;又如我要Implements IPersistStorage\IPersistFile 就可以我自己的文件系统
    可在VB该怎么做????
    它们(指这些接口)既没类型库,更不是自动化接口。
    各们大虾给点提示吧