共用方式為


實作聲明

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

語法

實作 [ InterfaceName | ]

所需的 InterfaceNameClass 是型別函式庫中一個介面或類別的名稱,其方法將由 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 無法使用。 透過不同介面將物件指派給宣告的變數,能提供多態性行為。

另外請注意,前述定義的 CustomerSupplier 類別並不會暴露 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 支援與意見反應