Buscar..


Introducción

Una interfaz es una forma de definir un conjunto de comportamientos que realizará una clase. La definición de una interfaz es una lista de firmas de métodos (nombre, parámetros y tipo de retorno). Una clase que tiene todos los métodos se dice que "implementa" esa interfaz.

En VBA, el uso de interfaces le permite al compilador verificar que un módulo implemente todos sus métodos. Una variable o parámetro se puede definir en términos de una interfaz en lugar de una clase específica.

Interfaz simple - Flyable

La interfaz Flyable es un módulo de clase con el siguiente código:

Public Sub Fly()
    ' No code.
End Sub

Public Function GetAltitude() As Long
    ' No code.
End Function

Un módulo de clase, Airplane , usa la palabra clave Implements para decirle al compilador que genere un error a menos que tenga dos métodos: un sub Flyable_Fly() y una función Flyable_GetAltitude() que devuelva 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 módulo de segunda clase, Duck , también implementa 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

Podemos escribir una rutina que acepte cualquier valor de Flyable , sabiendo que responderá a un comando de Fly o GetAltitude :

Public Sub FlyAndCheckAltitude(F As Flyable)
    F.Fly
    Debug.Print F.GetAltitude
End Sub

Debido a que la interfaz está definida, la ventana emergente de IntelliSense mostrará Fly y GetAltitude for F

Cuando ejecutamos el siguiente código:

Dim MyDuck As New Duck
Dim MyAirplane As New Airplane

FlyAndCheckAltitude MyDuck
FlyAndCheckAltitude MyAirplane 

La salida es:

Flying With Wings!
30
Flying With Jet Engines!
10000

Tenga en cuenta que aunque la subrutina se llama Flyable_Fly tanto en Airplane como en Duck , se puede llamar como Fly cuando la variable o el parámetro se definen como Flyable . Si la variable se define específicamente como un Duck , debería llamarse como Flyable_Fly .

Múltiples interfaces en una clase - Volable y Swimable

Usando el ejemplo de Flyable como punto de partida, podemos agregar una segunda interfaz, Swimmable , con el siguiente código:

Sub Swim()
    ' No code
End Sub

El objeto Duck puede Implement tanto el vuelo como la natación:

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 clase de Fish puede implementar Swimmable , también:

Implements Swimmable

Public Sub Swimmable_Swim()
    Debug.Print "Swimming under the water"
End Sub

Ahora, podemos ver que el objeto Duck se puede pasar a un Sub como un Flyable por un lado, y un Swimmable por el otro:

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 salida de este código es:

Cheque de vuelo ...

Volando Con Alas!

30

Volando con motores a reacción!

10000

Cheque de natacion ...

Flotando en el agua

Nadando bajo el agua



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow