Interfejsy (Visual Basic)

Interfejsy definiują właściwości, metody i zdarzenia, które klasy mogą implementować. Interfejsy umożliwiają definiowanie funkcji jako małych grup ściśle powiązanych właściwości, metod i zdarzeń; Zmniejsza to problemy ze zgodnością, ponieważ można opracowywać ulepszone implementacje interfejsów bez narażania istniejącego kodu. Nowe funkcje można dodawać w dowolnym momencie, tworząc dodatkowe interfejsy i implementacje.

Istnieje kilka innych powodów, dla których warto używać interfejsów zamiast dziedziczenia klas:

  • Interfejsy lepiej nadają się do sytuacji, w których aplikacje wymagają wielu prawdopodobnie niepowiązanych typów obiektów w celu zapewnienia pewnych funkcji.

  • Interfejsy są bardziej elastyczne niż klasy podstawowe, ponieważ można zdefiniować jedną implementację, która może implementować wiele interfejsów.

  • Interfejsy są lepsze w sytuacjach, w których nie trzeba dziedziczyć implementacji z klasy bazowej.

  • Interfejsy są przydatne, gdy nie można używać dziedziczenia klas. Na przykład struktury nie mogą dziedziczyć z klas, ale mogą implementować interfejsy.

Deklarowanie interfejsów

Definicje interfejsu są ujęte w instrukcje Interface i End Interface . Po instrukcji Interface można dodać opcjonalną Inherits instrukcję, która wyświetla listę co najmniej jednego dziedziczonego interfejsu. Instrukcje Inherits muszą poprzedzać wszystkie inne oświadczenia w deklaracji z wyjątkiem komentarzy. Pozostałe instrukcje w definicji interfejsu powinny być Eventinstrukcjami , Sub, PropertyFunctionClassInterface, , Structurei .Enum Interfejsy nie mogą zawierać żadnego kodu implementacji lub instrukcji skojarzonych z kodem implementacji, takim jak End Sub lub End Property.

W przestrzeni nazw instrukcje interfejsu są Friend domyślnie, ale mogą być również jawnie zadeklarowane jako Public lub Friend. Interfejsy zdefiniowane w klasach, modułach, interfejsach i strukturach są Public domyślnie, ale można je również jawnie zadeklarować jako Public, , Friendlub ProtectedPrivate.

Uwaga

Słowo Shadows kluczowe można zastosować do wszystkich elementów członkowskich interfejsu. Słowo Overloads kluczowe można zastosować do Subinstrukcji , Functioni Property zadeklarowanych w definicji interfejsu. Ponadto instrukcje Property mogą mieć Defaultmodyfikatory , ReadOnlylub WriteOnly . Żadna z innych modyfikatorów —Public , Private, FriendProtected, OverridesSharedMustOverridelub — Overridablejest dozwolona. Aby uzyskać więcej informacji, zobacz Konteksty deklaracji i domyślne poziomy dostępu.

Na przykład poniższy kod definiuje interfejs z jedną funkcją, jedną właściwością i jednym zdarzeniem.

Interface IAsset
    Event ComittedChange(ByVal Success As Boolean)
    Property Division() As String
    Function GetID() As Integer
End Interface

Implementowanie interfejsów

Słowo Implements zarezerwowane Visual Basic jest używane na dwa sposoby. Instrukcja Implements oznacza, że klasa lub struktura implementuje interfejs. Słowo Implements kluczowe oznacza, że składowa klasy lub składowa struktury implementuje określony element członkowski interfejsu.

Implements — Instrukcja

Jeśli klasa lub struktura implementuje jeden lub więcej interfejsów, musi zawierać instrukcję Implements bezpośrednio po instrukcji Class or Structure . Instrukcja Implements wymaga, aby rozdzielona przecinkami lista interfejsów została zaimplementowana przez klasę. Klasa lub struktura musi implementować wszystkie elementy członkowskie interfejsu przy użyciu słowa kluczowego Implements .

Implementuje słowo kluczowe

Słowo Implements kluczowe wymaga zaimplementowania rozdzielanej przecinkami listy elementów członkowskich interfejsu. Ogólnie rzecz biorąc, określono tylko jeden element członkowski interfejsu, ale można określić wiele elementów członkowskich. Specyfikacja elementu członkowskiego interfejsu składa się z nazwy interfejsu, która musi być określona w instrukcji implements w klasie; kropka; oraz nazwę funkcji składowej, właściwości lub zdarzenia do zaimplementowania. Nazwa elementu członkowskiego, który implementuje element członkowski interfejsu, może używać dowolnego identyfikatora prawnego i nie jest ograniczona do InterfaceName_MethodName konwencji używanej we wcześniejszych wersjach Visual Basic.

Na przykład poniższy kod pokazuje, jak zadeklarować podprotynę o nazwie Sub1 , która implementuje metodę interfejsu:

Class Class1
    Implements interfaceclass.interface2

    Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1
    End Sub
End Class

Typy parametrów i typy zwracane elementu członkowskiego implementacji muszą być zgodne z właściwością interfejsu lub deklaracją składową w interfejsie. Najczęstszym sposobem implementacji elementu interfejsu jest element członkowski o takiej samej nazwie jak interfejs, jak pokazano w poprzednim przykładzie.

Aby zadeklarować implementację metody interfejsu, można użyć dowolnych atrybutów prawnych w deklaracjach metod wystąpienia, w tym Overloads, OverridableProtectedPrivatePublicOverridesProtected FriendMustOverrideFriend, Defaulti .Static Atrybut Shared nie jest legalny, ponieważ definiuje klasę, a nie metodę wystąpienia.

Za pomocą Implementsmetody można również napisać jedną metodę, która implementuje wiele metod zdefiniowanych w interfejsie, jak w poniższym przykładzie:

Class Class2
    Implements I1, I2

    Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4
    End Sub
End Class

Aby zaimplementować element członkowski interfejsu, możesz użyć prywatnego elementu członkowskiego. Gdy prywatny element członkowski implementuje element członkowski interfejsu, ten element członkowski staje się dostępny za pomocą interfejsu, mimo że nie jest dostępny bezpośrednio w zmiennych obiektów dla klasy.

Przykłady implementacji interfejsu

Klasy implementujące interfejs muszą implementować wszystkie jego właściwości, metody i zdarzenia.

W poniższym przykładzie zdefiniowano dwa interfejsy. Drugi interfejs , Interface2dziedziczy Interface1 i definiuje dodatkową właściwość i metodę.

Interface Interface1
    Sub sub1(ByVal i As Integer)
End Interface

' Demonstrates interface inheritance.
Interface Interface2
    Inherits Interface1
    Sub M1(ByVal y As Integer)
    ReadOnly Property Num() As Integer
End Interface

W następnym przykładzie zaimplementowany jest Interface1interfejs zdefiniowany w poprzednim przykładzie:

Public Class ImplementationClass1
    Implements Interface1
    Sub Sub1(ByVal i As Integer) Implements Interface1.sub1
        ' Insert code here to implement this method.
    End Sub
End Class

Ostatni przykład implementuje Interface2metodę , w tym metodę dziedziczona z Interface1elementu :

Public Class ImplementationClass2
    Implements Interface2
    Dim INum As Integer = 0
    Sub sub1(ByVal i As Integer) Implements Interface2.sub1
        ' Insert code here that implements this method.
    End Sub
    Sub M1(ByVal x As Integer) Implements Interface2.M1
        ' Insert code here to implement this method.
    End Sub

    ReadOnly Property Num() As Integer Implements Interface2.Num
        Get
            Num = INum
        End Get
    End Property
End Class

Właściwość readonly można zaimplementować za pomocą właściwości readwrite (czyli nie trzeba jej deklarować w klasie implementowania). Implementacja interfejsu obiecuje zaimplementować co najmniej elementy członkowskie zadeklarowane przez interfejs, ale można zaoferować więcej funkcji, takich jak umożliwienie zapisywania właściwości.

Tytuł Opis
Przewodnik: Tworzenie i implementowanie interfejsów Zawiera szczegółową procedurę, która przeprowadzi Cię przez proces definiowania i implementowania własnego interfejsu.
Wariancje w interfejsach Omówienie wariancji i kontrawariancji w interfejsach ogólnych oraz zawiera listę wariantów interfejsów ogólnych w .NET Framework.