实现语句
指定将在其所在的类模块中实现的接口或类。
语法
实现 [ InterfaceName | 类 ]
必需的 InterfaceName 或 Class 是类型库中的接口或类的名称,该接口或类的方法将由 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 变量,并且它可以被分配为 Customer 或 Supplier 类的对象,因为这两个类都实现了 PersonalData 接口。
另请注意, m_pd 变量只能访问 PersonalData 接口的成员。 如果为其分配了 Customer 对象,则 特定于客户的成员 CustomerAgentId 不可用。 同样,如果向它分配了 一个 Supplier 对象,则特定于供应商的成员 NumberOfProductLines 不可用。 将对象分配给使用不同接口声明的变量可提供多态行为。
另请注意,如前所述, Customer 和 Supplier 类不会公开 PersonalData 接口的成员。 访问 PersonalData 成员的唯一方法是将 Customer 或 Supplier 对象分配给声明为 PersonalData 的变量。 如果需要类似于继承的行为,并且 Customer 或 Supplier 类公开了 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。