Z językiem VB.NET da się pracować, co z powodzeniem czynię od blisko roku, ale niektóre rzeczy doprowadzają mnie do szału. Aby wyjaśnic o co chodzi posłużę się bardzo, bardzo prostym interfejsem pokazanym poniżej:
Public Interface IFun
Function Fun() As Integer
Function SuperFun() As Integer
End Interface
Implementacja funkcji
Fun oraz
SuperFun jest trywialna i wyglądają jak poniżej:
Public Function Fun() As Integer
Return 0
End Function
Public Function SuperFun() As Integer
Return 1
End Function
Jeszcze kod, który korzysta z tej implementacji:
Sub Main()
Dim fun As Fun = New Fun()
Dim ifun As IFun = fun
Console.WriteLine(fun.Fun() = ifun.Fun())
Console.WriteLine(fun.SuperFun() = ifun.SuperFun())
Console.WriteLine(fun.Fun() = ifun.SuperFun())
Console.WriteLine(fun.SuperFun() = ifun.Fun())
End Sub
A na koniec pytanie, jaki wynik zostanie wypisany na ekan? Założę się, że nikt się nie zawacha i odpowie:
True
True
False
False
Taki wynik jest oczywiście logiczny i prawidłowy ale nie zawsze, w przypadku VB.NET można uzyskać również taki wynik:
False
False
True
True
Nie trzeba do tego stosować żadnych sztuczek, wystarczy zwykła pomyłka. Pokazując implementację metod
Fun oraz
SuperFun celowo pominąłem słowo kluczowe
Implements, które określa jaki element intefejsu implementuje dana metoda. Kod klasy powinien wyglądać tak:
Public Class Fun
Implements IFun
Public Function Fun() As Integer Implements IFun.Fun
Return 0
End Function
Public Function SuperFun() As Integer Implements IFun.SuperFun
Return 1
End Function
End Class
Niestety ponieważ metody
Fun oraz
SuperFun mają takie same sygnatury to nic nie stoi na przeszkodzie aby zamienić miejscami
Implements IFun.Fun
z
Implements IFun.SuperFun i otrzymać coś takiego:
Public Class Fun
Implements IFun
Public Function Fun() As Integer Implements IFun.SuperFun
Return 0
End Function
Public Function SuperFun() As Integer Implements IFun.Fun
Return 1
End Function
End Class
Mały, wkurzajacy i bardzo trudny do wykrycia błąd wynikający z cech języka VB.NET.