Почему подпрограмма не может реализовать интерфейс и обрабатывать событие одновременно? - PullRequest
4 голосов
/ 12 апреля 2011

Почему подпрограмма не может реализовать интерфейс и обрабатывать событие одновременно?

Следующее дает мне синтаксическую ошибку:

Sub MySub() Handles MyButton.Click Implements MyInterface.MyMethod
End Sub

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

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

Синтаксическая ошибка соответствует грамматике языка в §9.2.1 спецификации языка VB 1 :

SubDeclaration :: =[Атрибуты] [ПроцедураModifier +] SubSignature [HandlesOrImplements] LineTerminatorблокEnd Sub StatementTerminator

и

HandlesOrImplements :: = HandlesClause |ImplementsClause

Таким образом, поддерживается только один метод для любого метода.Спецификация не содержит (на быстрый взгляд) обоснование этого ограничения.Для этого вам нужно будет поговорить с кем-то из команды разработчиков языка VB в Microsoft.


1 Это входит в комплект установки VS в ‹ VSRoot > \ VB \ Спецификации \ 1033

3 голосов
/ 12 апреля 2011

Я никогда не видел подробного обсуждения , почему это решение было принято командой VB.NET, но, честно говоря, я изо всех сил пытаюсь понять, как это имеет смысл с точки зрения разработки ООП.Методы обработчика событий обычно не должны выполнять какую-либо работу.Скорее, они должны вызывать другие методы для выполнения тяжелой работы.Другой метод, к которому они обращаются, это тот, который реализует ваш интерфейс.

Но это, безусловно, достижимо, если вы сделаете что-то вроде этого:

Public MustInherit Class MyParentClass
    Protected WithEvents MyButton As Button

    Protected MustOverride Sub MySub() Handles MyButton.Click
End Class

Public Class MyDerivedClass : Inherits MyParentClass : Implements IMyInterface
    Protected Overrides Sub MySub() Implements IMyInterface.MyMethod
        ' Do something here...
    End Sub
End Class

Также помните, что методы обработчика событий обычноиметь отличительную подпись;что-то вроде:

Public Sub MySub(ByVal sender As System.Object, ByVal e As System.EventArgs)

, что является еще одной причиной, по которой для метода-обработчика событий было бы крайне редко также иметь возможность реализовать метод, определенный в интерфейсе.

...