实现语句

指定将在其所在的类模块中实现的接口或类。

语法

实现 [ InterfaceName | ]

必需的 InterfaceNameClass类型库中的接口或的名称,该接口或类的方法将由 Visual Basic 类中的对应方法实现。

备注

接口是一组原型,表示接口封装的成员 (方法和属性) ;也就是说,它仅包含成员过程的声明。 提供一个或多个接口的所有方法和属性的实现。 类提供在其控制器调用每个函数时使用的代码。 所有类都至少实现一个接口,该接口被视为类的默认接口。 在 Visual Basic 中,任何不是已实现接口的显式成员的成员都将为默认接口的隐式成员。

当 Visual Basic 类实现一个接口时,该类提供此接口的类型库中所指定的所有 Public过程的其自己的版本。 除了提供接口原型和过程之间的映射之外, Implements 语句还促使类接受 COM QueryInterface 对指定接口 ID 的调用。

注意

[!注释] Visual Basic 不实现派生的类或接口。

当您实现接口或类时,您必须包括涉及的所有 Public 过程。 接口或类的实现中缺少成员会导致出现错误。 如果您未将代码置于您正在实现的类中的某个过程,则会引发相应的错误 (Const E_NOTIMPL = &H80004001),这样一来,实现的用户便能了解未实现成员。

Implements 语句无法出现在标准模块中。

示例

下面的示例说明如何使用 Implements 语句生成一组对多个类可用的声明。 通过 Implements 语句共享声明,两个类都无需自行生成任何声明。 该示例还演示了接口的使用如何允许抽象:可以使用 接口类型声明强类型变量。 然后,可为它分配实现 接口的不同类类型的对象。

假设有两种窗体,即 SelectorForm 和 DataEntryForm。 选择器窗体有两个按钮:客户数据和供应商数据。 若要输入客户或供应商的姓名和地址信息,用户单击选择器窗体上的“客户”按钮或“供应商”按钮,然后使用数据输入窗体输入名称和地址。 数据输入窗体包含两个文本字段: “名称” 和“ 地址”。

接口声明的以下代码位于名为 PersonalData 的类中:

Public Name As String 
Public Address As String 

支持客户数据的代码位于名为 Customer 的类模块中。 请注意,使用以接口名称 PersonalData_ 作为前缀命名的成员实现 PersonalData 接口。

Implements PersonalData

'For PersonalData implementation
Private m_name As String
Private m_address As String

'Customer specific
Public CustomerAgentId As Long

'PersonalData implementation
Private Property Let PersonalData_Name(ByVal RHS As String)
    m_name = RHS
End Property
 
Private Property Get PersonalData_Name() As String
    PersonalData_Name = m_name
End Property


Private Property Let PersonalData_Address(ByVal RHS As String)
    m_address = RHS
End Property

Private Property Get PersonalData_Address() As String
    PersonalData_Address = m_address
End Property


'nitialize members
Private Sub Class_Initialize()
    m_name = "[customer name]"
    m_address = "[customer address]"
    CustomerAgentID = 0
End Sub

支持供应商数据的代码位于名为 “供应商”的类模块中:

Implements PersonalData

'for PersonalData implementation
Private m_name As String
Private m_address As String

'Supplier specific
Public NumberOfProductLines As Long


'PersonalData implementation
Private Property Let PersonalData_Name(ByVal RHS As String)
    m_name = RHS
End Property
 Private Property Get PersonalData_Name() As String
    PersonalData_Name = m_name
End Property


Private Property Let PersonalData_Address(ByVal RHS As String)
    m_address = RHS
End Property

Private Property Get PersonalData_Address() As String
    PersonalData_Address = m_address
End Property


'initialize members
Private Sub Class_Initialize()
    m_name = "[supplier name]"
    m_address = "[supplier address]"
    NumberOfProductLines = 15
End Sub


以下代码支持 选择器 窗体:

Private cust As New Customer 
Private sup As New Supplier 
 
Private Sub Customer_Click() 
Dim frm As New DataEntryForm 
 Set frm.PD = cust 
 frm.Show 1 
End Sub 
 
Private Sub Supplier_Click() 
Dim frm As New DataEntryForm
 Set frm.PD = sup 
 frm.Show 1 
End Sub

以下代码支持 “数据输入” 窗体:

Private m_pd As PersonalData

Private Sub SetTextFields()
    With m_pd
        Text1 = .Name
        Text2 = .Address
    End With
End Sub

Public Property Set PD(Data As PersonalData) 
    Set m_pd = Data
    SetTextFields
End Property

Private Sub Text1_Change()
    m_pd.Name = Text1.Text
End Sub

Private Sub Text2_Change()
    m_pd.Address = Text2.Text
End Sub

请注意,在数据输入窗体中,如何使用 PersonalData 接口声明 m_pd 变量,并且它可以被分配为 CustomerSupplier 类的对象,因为这两个类都实现了 PersonalData 接口。

另请注意, m_pd 变量只能访问 PersonalData 接口的成员。 如果为其分配了 Customer 对象,则 特定于客户的成员 CustomerAgentId 不可用。 同样,如果向它分配了 一个 Supplier 对象,则特定于供应商的成员 NumberOfProductLines 不可用。 将对象分配给使用不同接口声明的变量可提供多态行为。

另请注意,如前所述, CustomerSupplier 类不会公开 PersonalData 接口的成员。 访问 PersonalData 成员的唯一方法是将 CustomerSupplier 对象分配给声明为 PersonalData 的变量。 如果需要类似于继承的行为,并且 CustomerSupplier 类公开了 PersonalData 成员,则必须将公共成员添加到 类。 这些可以通过委托给 PersonalData 接口实现来实现。

例如,可以使用以下内容扩展 Customer 类:

'emulate PersonalData inheritance
Public Property Let Name(ByVal RHS As String)
    PersonalData_Name = RHS
End Property

Public Property Get Name() As String
    Name = PersonalData_Name
End Property

Public Property Let Address(ByVal RHS As String)
    PersonalData_Address = RHS
End Property

Public Property Get Address() As String
    Address = PersonalData_Address
End Property

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。