W Visual Basic .NET dziedziczenie realizowane jest za pomocą słowa kluczowego Inherits. Pozwala to na tworzenie hierarchii klas, które implementują wspólne i nadpisywane metody oraz właściwości.
Aby wspierać polimorfizm, metody w klasie bazowej są deklarowane przy użyciu modyfikatora Overridable, a w klasie pochodnej są nadpisywane za pomocą Overrides. Aby zapobiec dalszemu nadpisywaniu, służy modyfikator NotOverridable.
Przykład:
' Klasa bazowa Animal z metodą wirtualną Public Class Animal Public Overridable Sub Speak() Console.WriteLine("Zwierzę wydaje dźwięk.") End Sub End Class ' Pochodne klasa Dog nadpisuje Speak Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("Pies szczeka.") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' Wydrukuje: Pies szczeka. End Sub
P: Czy w Visual Basic .NET można nadpisywać metody, które nie są zadeklarowane jako Overridable/Abstract w klasie bazowej?
O: Nie. Tylko metody oznaczone jako Overridable lub zadeklarowane za pomocą interfejsu/abstrakcji mogą być nadpisywane przy dziedziczeniu. Próba użycia Overrides dla zwykłej metody spowoduje błąd kompilacji.
' Błąd: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' Błąd kompilacji End Sub End Class
Historia
1. W prawdziwym projekcie, związanym z architekturą mikroserwisową, nowy członek zespołu zadeklarował metodę wirtualną jako zwykłą (bez Overridable) w klasie bazowej kontrolera. Później inny programista próbował nadpisać tę metodę dla specjalnej obróbki. W rezultacie pojawiło się duplikowanie logiki i błędy, ponieważ implementacja rodzica zawsze była wywoływana, mimo że metoda była obecna w klasie dziedziczącej.
Historia
2. Niewystarczające przemyślenie architektury i brak polimorfizmu doprowadziło do setek linii zbędnego kodu: w przypadku potrzeby dodania nowego dziedzica konieczne było przepisanie dużej części metody klasy bazowej, a nie tylko zaimplementowanie wymaganego Overridable. To skomplikowało utrzymanie i konserwację.
Historia
3. Przypadek z aplikacji korporacyjnej: podczas migracji na .NET Core programista oznaczył metodę jako Overridable, ale błędnie nie dodał Implements interfejsu. W rezultacie pojawiła się niejednoznaczność w rozwiązaniu metod w hierarchii dziedziczenia i wystąpiły problemy z wywoływaniem przez referencję do interfejsu, co doprowadziło do nieprawidłowego działania funkcjonalności.