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



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow