Зачем? Redeclare вещи для реализации интерфейсов ?! в VB.NET - PullRequest
1 голос
/ 26 ноября 2009

Я работаю в VB.NET v2

У меня есть интерфейс IMyInterface , и этот интерфейс реализует метод MyMethod .

У меня есть объект MyObjectBase . Этот объект содержит (тот же) метод MyMethod .

1) Если теперь мне нужно MyObject Inherits MyObjectBase Implements IMyInterface нужно ли мне переопределить? (тень, переопределить) MyMethod в классе MyObject?

2) Что теперь, если вместо метода MyMethod у меня MyEvent событие ?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 26 ноября 2009

В 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). С помощью своего кода вы явно создаете связь между этими двумя.

0 голосов
/ 26 ноября 2009

Это потому, что вы реализуете свой дочерний класс, вы должны переопределить его. Я считаю, что если вы просто унаследуете от базового варианта, который в любом случае реализован, вам не придется, если он вам не нужен.

...