指定一個介面或類別,將在該 類別模組 中實作。
語法
實作 [ InterfaceName | 類 ]
所需的 InterfaceName 或 Class 是型別函式庫中一個介面或類別的名稱,其方法將由 Visual Basic 類別中對應的方法實作。
註解
介面是一組原型,代表介面所封裝的方法 (屬性) 成員;也就是說,它僅包含成員程序的宣告。 類別提供一個或多個介面所有方法與屬性的實作。 類別提供當每個函式被類別控制器呼叫時所使用的程式碼。 所有類別至少實作一個介面,該介面被視為該類別的預設介面。 在 Visual Basic 中,任何未明確屬於已實作介面的成員,都是預設介面的成員。
當 Visual Basic 類別實作介面時,Visual Basic 類別會提供該介面型式庫中所有 Public程序 的版本。 除了提供介面原型與程序之間的映射外, Implements 陳述句還會讓類別接受指定介面 ID 的 COM QueryInterface 呼叫。
注意事項
Visual Basic 不實作衍生類別或介面。
當你實作介面或類別時,必須包含所有相關的 Public 程序。 介面或類別實作中缺少成員會導致錯誤。 如果你沒有在你實作的類別中的某個程序中放置程式碼,你可以觸發適當的錯誤 (Const E_NOTIMPL = &H80004001) ,讓使用者明白該成員尚未被實作。
實現聲明無法出現在標準模組中。
範例
以下範例展示了如何使用 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
支援供應商資料的程式碼位於一個名為 Supplier 的類別模組中:
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
請注意,在資料輸入表單中, m_pd 變數是透過 PersonalData 介面宣告的,且可被指派為 客戶 類別或 供應商 類別的物件,因為兩者皆實作了 PersonalData 介面。
另外請注意, m_pd 變數只能存取 PersonalData 介面的成員。 若指派了 客戶 物件,則客戶 專屬成員 CustomerAgentID 無法使用。 同樣地,若被指派 供應商物件, 則供應商專屬成員 NumberOfProductLines 無法使用。 透過不同介面將物件指派給宣告的變數,能提供多態性行為。
另外請注意,前述定義的 Customer 和 Supplier 類別並不會暴露 PersonalData 介面的成員。 存取 PersonalData 成員的唯一方法是將 客戶 或 供應商 物件指派到宣告為 PersonalData 的變數上。 若希望有類似繼承的行為,且客戶或供應商類別會暴露 PersonalData 成員,則必須將公開成員加入該類別。 這些可透過委派給 PersonalData 介面實作來實作。
例如, 客戶 類別可以擴充為以下內容:
'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 支援與意見反應。