2010-03-03 15 views
6

Jestem programistą C#, ale muszę pracować z pewnym kodem VB.Net i natknąłem się na sytuację, w której mam dwie metody interfejs o tej samej nazwie, ale o innych parametrach metody. Kiedy próbuję implementować ten interfejs w klasie, VB.Net wymaga jawnie deklarowania "Implementuje MethodName" po sygnaturze metody. Ponieważ obie nazwy metod są identyczne, jest to mylące kompilator. Czy istnieje sposób na obejście tego problemu? Podejrzewam, że to musi być częste zjawisko. jakieś pomysły?Jak zaimplementować interfejs w VB.Net, gdy dwie metody mają tę samą nazwę, ale różne parametry

N.B. To był raczej przypadek programisty, który nie sprawdził, czy dany interfejs nie zmienił się spod niego.

Odpowiedz

9

Jak to jest mylące kompilator? Kompilator spodziewa się znaleźć implementację dla każdego podpisu metody i rozróżnia implementacje według ich sygnatur.

Jeśli podpisy są identyczne/nierozróżnialne (w większości przypadków oznacza to, że argumenty są tego samego typu w tej samej kolejności) otrzymasz błąd projektowy związany z interfejsem, mówiąc, że te dwie metody nie mogą przeciążać siebie nawzajem, ponieważ mają ten sam podpis.

W każdym razie kompilator nie powinien być mylony. Jeśli potrzebujesz dodatkowej pomocy, dołącz próbkę kodu - te elementy są stosunkowo łatwe do rozwiązania.

Wskazówka: Podczas pisania implementacji, gdy tylko zapiszesz "implementuje MyInterface" i naciśniesz Enter - Visual Studio utworzy kod "szkieletu" implementacji, co pozwoli ci zaoszczędzić na pisaniu podpisów metod i skorelowaniu ich z Interfejs.

Przykład kodu posiadania dwóch metod o tej samej nazwie i everythign działa dobrze:

Interface MyInterface 
    Sub MySub(ByVal arg0 As DateTime) 
    Sub MySub(ByVal arg0 As ULong) 
End Interface 

Class MyImplementation 
    Implements MyInterface 

    Public Sub MySub(ByVal arg0 As Date) Implements MyInterface.MySub 
     ... 
    End Sub 

    Public Sub MySub(ByVal arg0 As ULong) Implements MyInterface.MySub 
     ... 
    End Sub 
End Class 
1

Można dokonać metoda prywatne i nadać mu inną nazwę.

odczuwalna:

Private Sub SaveImpl(ByVal someEntity As IEntity) Implements IRepository.Save 

to będzie wyglądać na zewnątrz, takich jak: someRepository.Save

+0

Technika ta jest również przydatna prostu za wdrażanie interfejsów jawnie, to znaczy takie, że metoda ta jest dostępna tylko wtedy, gdy obiekt jest traktowany jako typ interfejsu, a nie widoczny w inny sposób. Podobny do jawnej implementacji interfejsu w C#. –

Powiązane problemy