Szukaj…
Wprowadzenie
Interfejs to sposób na zdefiniowanie zestawu zachowań, które będzie wykonywać klasa. Definicja interfejsu to lista podpisów metod (nazwa, parametry i typ zwracany). Mówi się, że klasa posiadająca wszystkie metody „implementuje” ten interfejs.
W VBA użycie interfejsów pozwala kompilatorowi sprawdzić, czy moduł implementuje wszystkie swoje metody. Zmienną lub parametr można zdefiniować w kategoriach interfejsu zamiast konkretnej klasy.
Prosty interfejs - Flyable
Interfejs Flyable
to moduł klasy z następującym kodem:
Public Sub Fly()
' No code.
End Sub
Public Function GetAltitude() As Long
' No code.
End Function
Moduł klasy, Airplane
, używa słowa kluczowego Implements
aby powiedzieć kompilatorowi, aby zgłosił błąd, chyba że ma dwie metody: sub Flyable_Fly()
i funkcję Flyable_GetAltitude()
która zwraca wartość 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
Moduł drugiej klasy, Duck
, również implementuje 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
Możemy napisać procedurę, która akceptuje dowolną wartość Flyable
, wiedząc, że zareaguje ona na polecenie Fly
lub GetAltitude
:
Public Sub FlyAndCheckAltitude(F As Flyable)
F.Fly
Debug.Print F.GetAltitude
End Sub
Ponieważ interfejs jest zdefiniowany, okno wyskakujące IntelliSense pokaże Fly
i GetAltitude
dla F
Kiedy uruchamiamy następujący kod:
Dim MyDuck As New Duck
Dim MyAirplane As New Airplane
FlyAndCheckAltitude MyDuck
FlyAndCheckAltitude MyAirplane
Dane wyjściowe to:
Flying With Wings!
30
Flying With Jet Engines!
10000
Zauważ, że chociaż podprogram ma nazwę Flyable_Fly
zarówno w Airplane
jak i Duck
, można go wywołać jako Fly
gdy zmienna lub parametr jest zdefiniowany jako Flyable
. Jeśli zmienna jest zdefiniowana konkretnie jako Duck
, musiałaby zostać wywołana jako Flyable_Fly
.
Wiele interfejsów w jednej klasie - Flyable i Swimable
Korzystając z przykładu Flyable
jako punktu wyjścia, możemy dodać drugi interfejs, Swimmable
, z następującym kodem:
Sub Swim()
' No code
End Sub
Duck
obiekt może Implement
zarówno latania i pływania:
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
Klasa Fish
może również zaimplementować Swimmable
:
Implements Swimmable
Public Sub Swimmable_Swim()
Debug.Print "Swimming under the water"
End Sub
Teraz możemy zobaczyć, że obiekt Duck
może być przekazany do Flyable
podwodnej jako Flyable
z jednej strony, a Swimmable
z drugiej:
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
Dane wyjściowe tego kodu to:
Fly Check ...
Latanie ze skrzydłami!
30
Latanie z silnikami odrzutowymi!
dziesięć tysięcy
Kontrola pływania ...
Unosi się na wodzie
Pływanie pod wodą