Partager via


Implémente l’instruction

Spécifie une interface ou une classe qui sera implémentée dans le module de classe dans lequel elle apparaît.

Syntaxe

Implémente [ Classe InterfaceName | ]

Les paramètres obligatoires InterfaceName ou Class représentent les noms d'une interface ou d'une classe dans une bibliothèque de types dont les méthodes seront implémentées par les méthodes correspondantes dans la classe Visual Basic.

Remarques

Une interface est une collection de prototypes représentant les membres (méthodes et propriétés) que l’interface encapsule ; autrement dit, il contient uniquement les déclarations pour les procédures membres. Une classe fournit une implémentation de toutes les méthodes et propriétés d’une ou plusieurs interfaces. Les classes fournissent le code utilisé lorsque chaque fonction est appelée par un contrôleur de la classe. Toutes les classes implémentent au moins une interface, considérée comme l'interface par défaut de la classe. Dans Visual Basic, un membre n'appartenant pas explicitement à une interface implémentée est implicitement un membre de l'interface par défaut.

Lorsqu’une classe Visual Basic implémente une interface, la classe Visual Basic fournit ses propres versions de toutes les procéduresPublic spécifiées dans la bibliothèque de types de l’interface. Outre le mappage qu'elle assure entre les prototypes de l'interface et vos procédures, l'instruction Implements force la classe à accepter les appels QueryInterface sur le composant COM pour l'ID d'interface spécifié.

Remarque

Visual Basic n'implémente pas les interfaces ni les classes dérivées.

Lorsque vous implémentez une interface ou une classe, vous devez inclure toutes les procédures Public concernées. Si un membre est absent de l'implémentation d'une interface ou d'une classe, une erreur se produit. Si vous n'insérez pas de code dans l'une des procédures d'une classe que vous implémentez, vous pouvez générer l'erreur appropriée (Const E_NOTIMPL = &H80004001) pour qu'un utilisateur de l'implémentation comprenne qu'un membre n'est pas implémenté.

L'instruction Implements ne peut pas apparaître dans un module standard.

Exemple

L'exemple suivant illustre l'utilisation de l'instruction Implements pour permettre à plusieurs classes d'accéder à un jeu de déclarations. En partageant les déclarations via l'instruction Implements, aucune des classes n'a besoin de faire de déclarations. L’exemple montre également comment l’utilisation d’une interface permet l’abstraction : une variable fortement de type peut être déclarée à l’aide du type d’interface. Des objets de différents types de classe qui implémentent l’interface peuvent ensuite lui être attribués.

Supposons qu’il existe deux formulaires , SelectorForm et DataEntryForm. Le formulaire de sélection comporte deux boutons : Données client et Données du fournisseur. Pour entrer le nom et l’adresse d’un client ou d’un fournisseur, l’utilisateur clique sur le bouton client ou le bouton fournisseur du formulaire de sélection, puis entre le nom et l’adresse à l’aide du formulaire de saisie de données. Le formulaire de saisie de données comporte deux champs de texte, Nom et Adresse.

Le code suivant pour les déclarations d’interface se trouve dans une classe appelée PersonalData :

Public Name As String 
Public Address As String 

Le code qui prend en charge les données client se trouve dans un module de classe appelé Client. Notez que l’interface PersonalData est implémentée avec des membres nommés avec le nom PersonalData_ de l’interface comme préfixe.

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

Le code qui prend en charge les données du fournisseur se trouve dans un module de classe appelé 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


Le code suivant prend en charge le formulaire Sélecteur :

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

Le code suivant prend en charge le formulaire d’entrée de données :

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

Notez que, dans le formulaire d’entrée de données, la variable m_ est déclarée à l’aide de l’interface PersonalData et qu’elle peut être affectée à des objets de la classe Customer ou Supplier , car les deux classes implémentent l’interface PersonalData.

Notez également que la variable m_ peut uniquement accéder aux membres de l’interface PersonalData. Si un objet Customer lui est affecté, le membre CustomerAgentId spécifique n’est pas disponible. De même, si un objet Supplier lui est attribué, le membre spécifique NumberOfProductLines n’est pas disponible. L’affectation d’un objet à des variables déclarées à l’aide de différentes interfaces fournit un comportement polymorphe.

Notez également que les classes Customer et Supplier , telles que définies précédemment, n’exposent pas les membres de l’interface PersonalData. La seule façon d’accéder aux membres PersonalData consiste à affecter un objet Customer ou Supplier à une variable déclarée comme PersonalData. Si un comportement de type héritage est souhaité, avec la classe Customer ou Supplier exposant les membres PersonalData, des membres publics doivent être ajoutés à la classe . Ceux-ci peuvent être implémentés en déléguant aux implémentations de l’interface PersonalData.

Par exemple, la classe Customer peut être étendue avec les éléments suivants :

'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

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.