Почему?Переобъявлять вещи для реализации интерфейсов?!в ВБ.НЕТ

StackOverflow https://stackoverflow.com/questions/1804108

Вопрос

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top