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ć Event
instrukcjami , Sub
, Property
Function
Class
Interface
, , Structure
i .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
, , Friend
lub Protected
Private
.
Uwaga
Słowo Shadows
kluczowe można zastosować do wszystkich elementów członkowskich interfejsu. Słowo Overloads
kluczowe można zastosować do Sub
instrukcji , Function
i Property
zadeklarowanych w definicji interfejsu. Ponadto instrukcje Property
mogą mieć Default
modyfikatory , ReadOnly
lub WriteOnly
. Żadna z innych modyfikatorów —Public
, Private
, Friend
Protected
, Overrides
Shared
MustOverride
lub — Overridable
jest 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
, Overridable
Protected
Private
Public
Overrides
Protected Friend
MustOverride
Friend
, Default
i .Static
Atrybut Shared
nie jest legalny, ponieważ definiuje klasę, a nie metodę wystąpienia.
Za pomocą Implements
metody 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 , Interface2
dziedziczy 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 Interface1
interfejs 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 Interface2
metodę , w tym metodę dziedziczona z Interface1
elementu :
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.
Tematy pokrewne
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. |