實作語句
指定介面或類別,該介面或類別將在出現的 類模組 中實作。
語法
實作 [ InterfaceName | 類別 ]
必要的 InterfaceName 或 Class 是類型庫中介面或類別的名稱,其方法將由 Visual Basic 類別中的對應方法實作。
註解
介面是原型的集合,代表介面所封裝 (方法和屬性) 的成員;也就是說,它只包含成員程式的宣告。 類別提供一或多個介面之所有方法和屬性的實作。 類別提供當類別的控制器呼叫每個函式時所使用的程序代碼。 所有類別都會實作至少一個介面,這會被視為 類別的預設介面。 在 Visual Basic 中,任何未明確成為實作介面成員的成員,都會隱含地成為預設介面的成員。
當 Visual Basic 類別實作介面時,Visual Basic 類別會提供其本身版本的所有 Public程式指定於介面的類型庫中。 除了提供介面原型和程式之間的對應之外, Implements 語句還會讓 類別接受指定介面標識碼的 COM QueryInterface 呼叫。
注意事項
Visual Basic 不會實作衍生類別或介面。
當您實作介面或類別時,必須包含所有相關的 公用 程式。 介面或類別實作中遺漏的成員會造成錯誤。 如果您未將程式代碼放在您要實作之類別的其中一個程式中,您可以在 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
支援供應商資料的程式代碼 位於名為 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
請注意,在數據輸入窗體中, 如何 使用 PersonalData 介面來宣告m_pd變數,而且可以指派 Customer 或 Supplier 類別的物件,因為這兩個類別都會實作 PersonalData 介面。
另請注意, m_pd 變數只能存取 PersonalData 介面的成員。 如果將 Customer 物件指派給該物件,則無法使用 客戶特定成員 CustomerAgentId 。 同樣地,如果將 Supplier 物件指派給它,則無法使用供應商特定成員 NumberOfProductLines 。 將物件指派給使用不同介面宣告的變數,可提供多型行為。
另請注意,先前定義 的客戶 和 供應商 類別不會公開 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 支援與意見反應。