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ą



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow