實作語句

指定介面或類別,該介面或類別將在出現的 類模組 中實作。

語法

實作 [ InterfaceName | 類別 ]

必要的 InterfaceNameClass類型庫中介面或類別的名稱,其方法將由 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變數,而且可以指派 CustomerSupplier 類別的物件,因為這兩個類別都會實作 PersonalData 介面。

另請注意, m_pd 變數只能存取 PersonalData 介面的成員。 如果將 Customer 物件指派給該物件,則無法使用 客戶特定成員 CustomerAgentId 。 同樣地,如果將 Supplier 物件指派給它,則無法使用供應商特定成員 NumberOfProductLines 。 將物件指派給使用不同介面宣告的變數,可提供多型行為。

另請注意,先前定義 的客戶供應商 類別不會公開 PersonalData 介面的成員。 存取 PersonalData 成員的唯一方法是將 CustomerSupplier 物件指派給宣告為 PersonalData 的變數。 如果需要類似繼承的行為,且 CustomerSupplier 類別公開 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 支援與意見反應