Recherche…
Introduction
Une interface est un moyen de définir un ensemble de comportements qu'une classe doit exécuter. La définition d'une interface est une liste de signatures de méthode (nom, paramètres et type de retour). On dit qu'une classe ayant toutes les méthodes "implémente" cette interface.
En VBA, l'utilisation d'interfaces permet au compilateur de vérifier qu'un module implémente toutes ses méthodes. Une variable ou un paramètre peut être défini en termes d'interface au lieu d'une classe spécifique.
Interface simple - Flyable
L'interface Flyable
est un module de classe avec le code suivant:
Public Sub Fly()
' No code.
End Sub
Public Function GetAltitude() As Long
' No code.
End Function
Un module de classe, Airplane
, utilise le mot-clé Implements
pour indiquer au compilateur de générer une erreur à moins qu'il ne dispose de deux méthodes: un sous-objet Flyable_Fly()
et une fonction Flyable_GetAltitude()
qui renvoie un Long
.
Implements Flyable
Public Sub Flyable_Fly()
Debug.Print "Flying With Jet Engines!"
End Sub
Public Function Flyable_GetAltitude() As Long
Flyable_GetAltitude = 10000
End Function
Un module de deuxième classe, Duck
, implémente également Flyable
:
Implements Flyable
Public Sub Flyable_Fly()
Debug.Print "Flying With Wings!"
End Sub
Public Function Flyable_GetAltitude() As Long
Flyable_GetAltitude = 30
End Function
Nous pouvons écrire une routine qui accepte toute valeur Flyable
, sachant qu'elle répondra à une commande de Fly
ou GetAltitude
:
Public Sub FlyAndCheckAltitude(F As Flyable)
F.Fly
Debug.Print F.GetAltitude
End Sub
Comme l'interface est définie, la fenêtre contextuelle IntelliSense affiche Fly
et GetAltitude
pour F
Lorsque nous exécutons le code suivant:
Dim MyDuck As New Duck
Dim MyAirplane As New Airplane
FlyAndCheckAltitude MyDuck
FlyAndCheckAltitude MyAirplane
La sortie est la suivante:
Flying With Wings!
30
Flying With Jet Engines!
10000
Notez que même si la sous-routine est nommée Flyable_Fly
à la fois dans Airplane
et Duck
, elle peut être appelée Fly
lorsque la variable ou le paramètre est défini comme Flyable
. Si la variable est définie spécifiquement comme un Duck
, elle devrait être appelée Flyable_Fly
.
Plusieurs interfaces dans une classe - Flyable et Swimable
En utilisant l'exemple Flyable
comme point de départ, nous pouvons ajouter une seconde interface, Swimmable
, avec le code suivant:
Sub Swim()
' No code
End Sub
L'objet Duck
peut Implement
fois voler et nager:
Implements Flyable
Implements Swimmable
Public Sub Flyable_Fly()
Debug.Print "Flying With Wings!"
End Sub
Public Function Flyable_GetAltitude() As Long
Flyable_GetAltitude = 30
End Function
Public Sub Swimmable_Swim()
Debug.Print "Floating on the water"
End Sub
Une classe Fish
peut également implémenter Swimmable
:
Implements Swimmable
Public Sub Swimmable_Swim()
Debug.Print "Swimming under the water"
End Sub
Maintenant, nous pouvons voir que l'objet Duck
peut être transmis à un Sub en tant que Flyable
d'une part, et Swimmable
de l'autre:
Sub InterfaceTest()
Dim MyDuck As New Duck
Dim MyAirplane As New Airplane
Dim MyFish As New Fish
Debug.Print "Fly Check..."
FlyAndCheckAltitude MyDuck
FlyAndCheckAltitude MyAirplane
Debug.Print "Swim Check..."
TrySwimming MyDuck
TrySwimming MyFish
End Sub
Public Sub FlyAndCheckAltitude(F As Flyable)
F.Fly
Debug.Print F.GetAltitude
End Sub
Public Sub TrySwimming(S As Swimmable)
S.Swim
End Sub
La sortie de ce code est la suivante:
Fly Check ...
Voler avec des ailes!
30
Voler avec des moteurs à réaction!
10000
Swim Check ...
Flottant sur l'eau
Nager sous l'eau