Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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, opracowują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 bazowe, 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 pomiędzy oświadczeniami 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 instrukcje w deklaracji z wyjątkiem komentarzy. Pozostałe instrukcje w definicji interfejsu powinny być Event, Sub, Function, Property, Interface, Class, Structure i Enum instrukcjami. Interfejsy nie mogą zawierać żadnego kodu implementacji ani 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, Protectedlub Private.
Uwaga / Notatka
Słowo Shadows kluczowe można zastosować do wszystkich elementów członkowskich interfejsu. Słowo kluczowe Overloads można zastosować do instrukcji Sub, Function oraz Property zadeklarowanych w definicji interfejsu. Ponadto instrukcje Property mogą mieć modyfikatory Default, ReadOnly lub WriteOnly. Żadna z innych modyfikatorów —PublicPrivate , , Friend, ProtectedShared, Overrides, MustOverridelub 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 zarezerwowane Implements języka 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.
Deklaracja Implements
Jeśli klasa lub struktura implementuje co najmniej jeden interfejs, musi zawierać instrukcję Implements bezpośrednio po instrukcji Class or Structure . Instrukcja Implements wymaga rozdzielonej przecinkami listy interfejsów, które mają być implementowane przez klasę. Klasa lub struktura musi implementować wszystkie elementy członkowskie interfejsu przy użyciu słowa kluczowego Implements .
Implementacja słowa kluczowego
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 składowej interfejsu składa się z nazwy interfejsu, która musi być określona w instrukcji implements w klasie; kropka; oraz nazwa 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 języka Visual Basic.
Na przykład poniższy kod pokazuje, jak zadeklarować podprokutynę 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 członka implementacji muszą być zgodne z właściwością lub deklaracją składową w interfejsie. Najczęstszym sposobem implementacji elementu interfejsu jest użycie członka o tej samej nazwie co interfejs, jak pokazano w poprzednim przykładzie.
Aby zadeklarować implementację metody interfejsu, można użyć dowolnych atrybutów, które są legalne w deklaracjach metod wystąpienia, w tym Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default i Static. Atrybut Shared nie jest legalny, ponieważ definiuje klasę, a nie metodę wystąpienia.
Przy użyciu Implements można napisać także 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żna użyć prywatnego elementu członkowskiego. Gdy prywatny składnik implementuje składnik interfejsu, ten składnik staje się dostępny za pośrednictwem interfejsu, choć nie jest bezpośrednio dostępny 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, który dziedziczy z Interface1, 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
W ostatnim przykładzie zaimplementowano element Interface2, w tym metodę dziedziczoną z Interface1:
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
Można zaimplementować właściwość tylko do odczytu korzystając z właściwości do zapisu i odczytu (to znaczy, że nie trzeba jej deklarować jako tylko do odczytu w klasie implementującej). Implementacja interfejsu zobowiązuje do zaimplementowania co najmniej członków zadeklarowanych przez interfejs, ale można zaoferować więcej funkcjonalności, na przykład umożliwienie zapisu właściwości.
Tematy pokrewne
| Nazwa | Opis |
|---|---|
| Przewodnik: tworzenie i implementowanie interfejsów | Zawiera szczegółową procedurę, która przeprowadzi Cię przez proces definiowania i implementowania własnego interfejsu. |
| Wariancja w interfejsach ogólnych | Omówia wariancję i kontrawariancję w interfejsach ogólnych oraz podaje listę wariantów interfejsów ogólnych w frameworku .NET. |