Interfejs w Visual Basic jest deklarowany za pomocą słowa kluczowego Interface. Interfejs definiuje zestaw metod, które muszą zostać zaimplementowane w klasach, które go realizują.
Szczegóły:
Przykład kodu:
Interface ILogger Sub Log(message As String) End Interface Interface IErrorNotifier Sub NotifyError(errorMsg As String) End Interface Public Class FileLogger Implements ILogger, IErrorNotifier Public Sub Log(message As String) Implements ILogger.Log ' Implementacja logowania End Sub Public Sub NotifyError(errorMsg As String) Implements IErrorNotifier.NotifyError ' Implementacja powiadamiania o błędzie End Sub End Class
Czy można zaimplementować dwa interfejsy, jeśli oba deklarują metody o tej samej nazwie, ale różnej sygnaturze? Czy taka klasa będzie się kompilować?
Odpowiedź: Tak, można zaimplementować dwa takie interfejsy. Przy różnicy sygnatur kompilator wymaga jawnej implementacji każdej metody, w przeciwnym razie wystąpi niejednoznaczność. Użyj pełnej nazwy interfejsu przy implementacji:
Public Class Example Implements IFirst, ISecond Public Sub DoWork() Implements IFirst.DoWork ' Implementacja dla IFirst End Sub Public Sub DoWork(value As Integer) Implements ISecond.DoWork ' Implementacja dla ISecond End Sub End Class
Historia
Utrata funkcjonalności z powodu niepełnej implementacji interfejsu: Programista nie zaimplementował wszystkich elementów zadeklarowanego interfejsu, błąd ujawnił się niejawnie przy dodawaniu klasy do kolekcji oczekującej w pełni zaimplementowanego kontraktu, co doprowadziło do awarii w czasie wykonywania.
Historia
Konflikt metod przy implementacji wielu interfejsów: W projekcie trzeba było zaimplementować interfejsy z takimi samymi metodami. Z powodu braku jawnej implementacji metody "nakładały się" na siebie, a odbiorcy otrzymywali tylko jedną z wersji, co doprowadziło do nieprawidłowego zachowania logiki.
Historia
Naruszenie zasady separacji odpowiedzialności: W dużym projekcie zbyt wiele interfejsów realizowała jedna klasa z powodu kopiowania kodu. W rezultacie było trudno śledzić implementacje kontraktów i utrzymywać kompatybilność między interfejsami.