В VB.NET вам необходимо вручную связать ваш интерфейсный контракт с вашими реализациями. Посмотрите на следующий пример:
Interface MyInterface
Sub Foo()
End Interface
Class TestClass
Implements MyInterface
Public Sub Test() Implements MyInterface.Foo
Console.WriteLine("Test")
End Sub
Public Sub Foo()
Console.WriteLine("Foo")
End Sub
End Class
Затем взгляните на следующий код и его вывод:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
Это имеет то преимущество, что реализация интерфейса не ограничивает вас в именовании вашей функции, как вы хотите . Недостатком является то, что вы должны явно связывать ваши методы класса с вашими объявлениями интерфейса, используя ключевое слово Implements
.
Так много об объяснении. Теперь позвольте мне перейти к вашей проблеме: поскольку вы не можете заставить Button
реализовать IVisibleChanged, вы можете сделать что-то подобное:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
- ключевое слово VB.NET, относящееся к суперклассу. Аналогично, в случае MyMethod
вы можете сделать
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
Это может показаться ненужной дополнительной работой, но в некотором смысле имеет смысл: Button.VisibleChanged
и IVisibleChanged.VisibleChanged
могут быть событиями с двумя совершенно разными семантиками, которые просто имеют одно и то же имя (в конце концов Button
не не реализует IVisibleChanged
). С помощью своего кода вы явно создаете связь между этими двумя.