2015-05-19 20 views
5

pojawia się błąd: Class 'QueryParameterComparer' must implement 'Function Compare(x As QueryParameter, y As QueryParameter) As Integer' for interface 'System.Collections.Generic.IComparer(Of QueryParameter)'.błąd, że muszę zaimplementować funkcję w klasie, chociaż funkcja jest zdefiniowana

Na tej definicji klasy:

Protected Class QueryParameterComparer 
     Implements IComparer(Of QueryParameter) 

     Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer 
      If x.Name = y.Name Then 
       Return String.Compare(x.Value, y.Value) 
      Else 
       Return String.Compare(x.Name, y.Name) 
      End If 
     End Function 

    End Class 

Próbowałem też pisząc go w pełni:

Protected Class QueryParameterComparer 
     Implements System.Collections.Generic.IComparer(Of QueryParameter) 

     Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer 
      If x.Name = y.Name Then 
       Return String.Compare(x.Value, y.Value) 
      Else 
       Return String.Compare(x.Name, y.Name) 
      End If 
     End Function 

    End Class 

Czego mi brakuje?

+3

Implementacja metody interfejsu wymaga słowa kluczowego * Implements *. Po prostu pozwól, aby IDE pomógł Ci osiągnąć sukces. Usuń funkcję, umieść kursor za wierszem Yadayada narzędzi i naciśnij klawisz Enter. –

+1

Woah! Nigdy wcześniej tego nie widziałem! Właśnie zaznaczyłem to jako duplikat, a potem zdałem sobie sprawę, że to ty zadałeś podwójne pytanie lat temu. Zabawne ... –

+0

@StevenDoggart: LOL! : S Niektórzy ludzie nigdy się nie uczą? :) Nie można już usunąć tego posta .... – Flo

Odpowiedz

8

W przeciwieństwie do C#, gdzie nazwa metody po prostu musi dopasować jeden w interfejsie, w VB.NET, wszystkie implementacje interfejsu musi być zawsze wyraźnie stwierdził z Implements kluczowych na każdego członka:

Protected Class QueryParameterComparer 
    Implements IComparer(Of QueryParameter) 

    Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements IComparer(Of QueryParameter).Compare 
     ' ... 
    End Function 
End Class 
3

VB.Net wymaga określenia, które metody są metodami implementacji interfejsów.

Public Function Compare(x As QueryParameter, y As QueryParameter) As Integer Implements System.Collections.Generic.IComparer(Of QueryParameter).Compare 

To dziwne, ale pozwala na określenie innej nazwy funkcji dla realizacji. Powoduje to, że bezpośredni dostęp do twojej klasy może mieć jedną nazwę dla funkcji, ale odwołanie za pośrednictwem interfejsu będzie miało nazwę metody interfejsu. Coś innego, co możesz zrobić, to określić metodę Private, aby uzyskać dostęp do metody tylko poprzez odniesienie do interfejsu.