Freigeben über


Implements-Anweisung

Gibt eine Schnittstelle oder Klasse an, die im Klassenmodul implementiert wird, in dem sie angezeigt wird.

Syntax

Implementiert [ InterfaceName-Klasse | ]

Das erforderliche InterfaceName- oder Class-Element ist der Name einer Schnittstelle oder Klasse in einer Typbibliothek, deren Methoden über die entsprechenden Methoden in der Visual Basic-Klasse implementiert werden.

Hinweise

Eine Schnittstelle ist eine Sammlung von Prototypen, die die Member (Methoden und Eigenschaften) darstellen, die die Schnittstelle kapselt. Das heißt, es enthält nur die Deklarationen für die Memberprozeduren. Eine -Klasse stellt eine Implementierung aller Methoden und Eigenschaften einer oder mehrerer Schnittstellen bereit. Klassen stellen den Code bereit, der verwendet wird, wenn jede Funktion von einem Controller der -Klasse aufgerufen wird. Alle Klassen implementieren mindestens eine Schnittstelle, die als Standardschnittstelle der -Klasse gilt. In Visual Basic ist jeder Member, der nicht explizit ein Member einer implementierten Schnittstelle ist, implizit ein Member der Standardschnittstelle.

Wenn eine Visual Basic-Klasse eine Schnittstelle implementiert, stellt die Visual Basic-Klasse eigene Versionen aller in der Typbibliothek der Schnittstelle angegebenen Public-Prozeduren zur Verfügung. Neben der Bereitstellung einer Zuordnung zwischen den Schnittstellenprototypen und Ihren Prozeduren führt die Implements -Anweisung dazu, dass die Klasse COM QueryInterface-Aufrufe für die angegebene Schnittstellen-ID akzeptiert.

Hinweis

[!HINWEIS] Visual Basic implementiert keine abgeleiteten Klassen oder Schnittstellen.

Wenn Sie eine Schnittstelle oder Klasse implementieren, müssen Sie alle beteiligten öffentlichen Prozeduren einschließen. Ein fehlender Member in einer Implementierung einer Schnittstelle oder Klasse verursacht einen Fehler. Wenn Sie code nicht in einer der Prozeduren in einer Klasse platzieren, die Sie implementieren, können Sie den entsprechenden Fehler (Const E_NOTIMPL = &H80004001) auslösen, damit ein Benutzer der Implementierung versteht, dass ein Member nicht implementiert ist.

Die Implements-Anweisung darf nicht in einem Standardmodul angezeigt werden.

Beispiel

Im folgenden Beispiel wird gezeigt, wie die Implements -Anweisung verwendet wird, um eines Satz mit Deklarationen mehreren Klassen zur Verfügung zu stellen. Durch die gemeinsame Verwendung der Deklarationen über die Implements -Anweisung muss kein Klasse selbst Deklarationen erstellen. Das Beispiel zeigt auch, wie die Verwendung einer Schnittstelle Abstraktion ermöglicht: Eine Variable mit starkem Typ kann mithilfe des Schnittstellentyps deklariert werden. Es können dann Objekte verschiedener Klassentypen zugewiesen werden, die die -Schnittstelle implementieren.

Angenommen, es gibt zwei Formulare: SelectorForm und DataEntryForm. Das Auswahlformular verfügt über zwei Schaltflächen: Kundendaten und Lieferantendaten. Um Namen- und Adressinformationen für einen Kunden oder Lieferanten einzugeben, klickt der Benutzer auf die Kundenschaltfläche oder die Lieferantenschaltfläche im Auswahlformular und gibt dann den Namen und die Adresse mithilfe des Dateneingabeformulars ein. Das Dateneingabeformular enthält zwei Textfelder: Name und Adresse.

Der folgende Code für die Schnittstellendeklarationen befindet sich in einer Klasse namens PersonalData:

Public Name As String 
Public Address As String 

Der Code, der die Kundendaten unterstützt, befindet sich in einem Klassenmodul namens Customer. Beachten Sie, dass die PersonalData-Schnittstelle mit Membern implementiert wird, die mit dem Schnittstellennamen PersonalData_ als Präfix benannt sind.

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

Der Code, der die Lieferantendaten unterstützt, befindet sich in einem Klassenmodul namens 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


Der folgende Code unterstützt das Selektorformular :

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

Der folgende Code unterstützt das Dateneingabeformular :

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

Beachten Sie, wie im Dateneingabeformular die variable m_pd mithilfe der PersonalData-Schnittstelle deklariert wird und ihr Objekte der Customer - oder Supplier-Klasse zugewiesen werden können, da beide Klassen die PersonalData-Schnittstelle implementieren.

Beachten Sie außerdem, dass die variable m_pd nur auf die Member der PersonalData-Schnittstelle zugreifen kann. Wenn ihm ein Customer-Objekt zugewiesen ist, ist das kundenspezifische Mitglied CustomerAgentId nicht verfügbar. Wenn ihm ein Supplier-Objekt zugewiesen ist, ist das lieferantenspezifische Element NumberOfProductLines nicht verfügbar. Das Zuweisen eines Objekts zu Variablen, die mithilfe verschiedener Schnittstellen deklariert wurden, bietet ein polymorphes Verhalten.

Beachten Sie außerdem, dass die Klassen Customer und Supplier , wie zuvor definiert, die Member der PersonalData-Schnittstelle nicht verfügbar machen. Die einzige Möglichkeit, auf die PersonalData-Mitglieder zuzugreifen, besteht darin, ein Customer - oder Supplier-Objekt einer Variablen zuzuweisen, die als PersonalData deklariert ist. Wenn ein vererbungsähnliches Verhalten gewünscht wird und die Customer - oder Supplier-Klasse die PersonalData-Member verfügbar macht, müssen der Klasse öffentliche Member hinzugefügt werden. Diese können durch Delegieren an die Implementierungen der PersonalData-Schnittstelle implementiert werden.

Beispielsweise könnte die Customer-Klasse um Folgendes erweitert werden:

'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

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.