Почему?Переобъявлять вещи для реализации интерфейсов?!в ВБ.НЕТ
-
05-07-2019 - |
Вопрос
Я работаю в VB.NET v2.
у меня есть интерфейс IMyИнтерфейс и этот интерфейс реализует метод МойМетод.
у меня есть объект MyObjectBase.Этот объект содержит (тот же) метод МойМетод.
1) Если сейчас я это сделаю MyObject Inherits MyObjectBase Implements IMyInterface
мне нужно переопределить? (тень, переопределение) MyMethod
в MyObject
сорт?
2) Что теперь, если вместо этого MyMethod
метод у меня есть MyEvent
событие?
Спасибо.
Решение
В 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
).С помощью вашего кода вы явно создаете связь между этими двумя.
Другие советы
Поскольку вы реализуете свой дочерний класс, вам придется его переопределить.Я считаю, что если вы просто наследуете базовый вариант, который в любом случае реализован, вам не придется этого делать, если он вам не нужен.