Ricerca…
introduzione
Un'interfaccia è un modo per definire un insieme di comportamenti che eseguirà una classe. La definizione di un'interfaccia è un elenco di firme del metodo (nome, parametri e tipo di ritorno). Si dice che una classe con tutti i metodi "implementa" quell'interfaccia.
In VBA, l'uso delle interfacce consente al compilatore di verificare che un modulo implementa tutti i suoi metodi. Una variabile o un parametro possono essere definiti in termini di un'interfaccia anziché di una classe specifica.
Interfaccia semplice - Flyable
L'interfaccia Flyable
è un modulo di classe con il seguente codice:
Public Sub Fly()
' No code.
End Sub
Public Function GetAltitude() As Long
' No code.
End Function
Un modulo di classe, Airplane
, utilizza la parola chiave Implements
per dire al compilatore di generare un errore a meno che non abbia due metodi: un sub Flyable_Fly()
e una funzione Flyable_GetAltitude()
che restituisce 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 modulo di seconda classe, Duck
, implementa anche 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
Possiamo scrivere una routine che accetta qualsiasi valore Flyable
, sapendo che risponderà a un comando di Fly
o GetAltitude
:
Public Sub FlyAndCheckAltitude(F As Flyable)
F.Fly
Debug.Print F.GetAltitude
End Sub
Poiché l'interfaccia è definita, la finestra a GetAltitude
IntelliSense mostrerà Fly
e GetAltitude
per F
Quando eseguiamo il seguente codice:
Dim MyDuck As New Duck
Dim MyAirplane As New Airplane
FlyAndCheckAltitude MyDuck
FlyAndCheckAltitude MyAirplane
L'output è:
Flying With Wings!
30
Flying With Jet Engines!
10000
Si noti che anche se la subroutine è denominata Flyable_Fly
sia in Airplane
che in Duck
, può essere chiamata come Fly
quando la variabile o parametro è definita come Flyable
. Se la variabile è definita specificamente come Duck
, dovrebbe essere chiamata come Flyable_Fly
.
Interfacce multiple in una classe - Flyable e Swimable
Utilizzando l'esempio Flyable
come punto di partenza, possiamo aggiungere una seconda interfaccia, Swimmable
, con il seguente codice:
Sub Swim()
' No code
End Sub
L'oggetto Duck
può Implement
sia il volo che il nuoto:
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
Una classe di Fish
può implementare anche Swimmable
:
Implements Swimmable
Public Sub Swimmable_Swim()
Debug.Print "Swimming under the water"
End Sub
Ora, possiamo vedere che l'oggetto Duck
può essere passato ad un Sub come Flyable
da un lato e Swimmable
dall'altro:
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
L'output di questo codice è:
Vola Controlla ...
Volare con le ali!
30
Volare con i motori a reazione!
10000
Swim Check ...
Galleggia sull'acqua
Nuotando sotto l'acqua