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 InterfaceImplementacja 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 FunctionJeszcze 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 SubA na koniec pytanie, jaki wynik zostanie wypisany na ekan? Założę się, że nikt się nie zawacha i odpowie:
True True False FalseTaki 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 TrueNie 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 ClassNiestety 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 ClassMały, wkurzajacy i bardzo trudny do wykrycia błąd wynikający z cech języka VB.NET.