實作聲明

指定一個介面或類別,將在該 類別模組 中實作。

語法

實作 [ 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 支援與意見反應。