Как реализовать интерфейс в VB.Net, когда два метода имеют одинаковое имя, но разные параметры - PullRequest
6 голосов
/ 03 марта 2010

Я программист на C #, но мне приходится работать с некоторым кодом VB.Net, и я столкнулся с ситуацией, когда у меня есть два метода на интерфейсе с одинаковым именем, но с разными параметрами метода. Когда я пытаюсь реализовать этот интерфейс в классе, VB.Net требует явного объявления «Implements MethodName» после подписи метода. Поскольку имена обоих методов идентичны, это сбивает с толку компилятор. Есть ли способ обойти эту проблему? Я подозреваю, что это должно быть обычным явлением. Есть мысли?

N.B. Это был скорее случай, когда программист не проверял, что рассматриваемый интерфейс не изменился из-под него.

Ответы [ 2 ]

9 голосов
/ 03 марта 2010

Как это смущает компилятор? Компилятор ожидает найти реализацию для каждой сигнатуры метода и различает реализации по их сигнатурам.

Если подписи идентичны / неразличимы (в большинстве случаев это означает, что аргументы имеют одинаковые типы в одном и том же порядке), вы получите ошибку времени разработки, связанную с интерфейсом, заявив, что два метода не могут перегрузить так как они имеют одинаковую подпись.

Так что, в любом случае, не следует путать компилятор. Если вам нужна дополнительная помощь, приложите пример кода - эти вещи относительно легко решить.

Совет. При написании реализации, как только вы запишите «реализует MyInterface» и нажмете «Enter» - Visual Studio создаст «каркасный» код реализации, который сохранит вас при написании сигнатур методов и их сопоставлении к интерфейсу.

Пример кода работы двух методов с одинаковыми именами и с одинаковыми именами:

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 голос
/ 03 марта 2010

Вы можете сделать метод закрытым и дать ему другое имя.

Как:

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

это будет выглядеть как: someRepository.Save

...