Как реализовать интерфейс в VB.Net, когда два метода имеют одинаковое имя, но разные параметры
Я программист на C#, но мне приходится работать с некоторым кодом VB.Net, и я столкнулся с ситуацией, когда у меня есть два метода на интерфейсе с одинаковым именем, но разными параметрами метода. Когда я пытаюсь реализовать этот интерфейс в классе, VB.Net требует явного объявления "Implements MethodName" после подписи метода. Поскольку имена обоих методов идентичны, это сбивает с толку компилятор. Есть ли способ обойти эту проблему? Я подозреваю, что это должно быть обычным явлением. Какие-нибудь мысли?
NB. Это был скорее случай, когда программист не проверял, что рассматриваемый интерфейс не изменился из-под него.
2 ответа
Как это сбивает с толку компилятор? Компилятор ожидает найти реализацию для каждой сигнатуры метода и различает реализации по их сигнатурам.
Если подписи идентичны / неразличимы (в большинстве случаев это означает, что аргументы имеют одинаковые типы в одном и том же порядке), вы получите ошибку времени разработки, связанную с интерфейсом, сказав, что оба метода не могут перегружать друг друга, так как они иметь одинаковую подпись.
Так что, в любом случае, компилятор не следует путать. Если вам нужна дополнительная помощь, пожалуйста, приложите пример кода - эти вещи относительно легко решить.
Совет: при написании реализации, как только вы запишите "реализует 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
Вы можете сделать метод приватным и дать ему другое имя.
Подобно:
Private Sub SaveImpl(ByVal someEntity As IEntity) Implements IRepository.Save
это будет выглядеть снаружи как: someRepository.Save