为什么sub不能同时实现接口和处理事件?

时间:2011-04-12 15:05:59

标签: .net vb.net interface event-handling language-design

为什么sub不能同时实现接口和处理事件?

以下是我的语法错误:

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

我知道我可以用另一种方法处理这种逻辑,但这不是重点。我只是想了解这背后的原因。

2 个答案:

答案 0 :(得分:4)

语法错误与语言语法一致,在VB语言规范 1 的§9.2.1中:

  

SubDeclaration :: =
    [属性] [ProcedureModifier +] SubSignature [HandlesOrImplements] LineTerminator
    块
    End Sub StatementTerminator

  

HandlesOrImplements :: = HandlesClause | ImplementsClause

因此任何一种方法都只支持一种方法。该规范没有(快速查看)包含此限制的基本原理。为此,您需要与Microsoft的VB语言设计团队的人员进行交流。


1 这包含在<< em> VSRoot > \ VB \ Specifications \ 1033下的VS安装中。

答案 1 :(得分:3)

我从来没有见过关于为什么这个决定是由VB.NET团队做出的详细讨论,但说实话,我很难从OOP中看出这有什么意义。设计观点。事件处理程序方法通常不应该做任何工作。相反,他们应该调用其他方法来完成繁重的工作。他们调用的另一种方法是实现接口的方法。

但如果你做这样的事情,它肯定是可以实现的:

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)

这是另一个原因,为什么 能够实现接口中定义的方法的事件处理程序方法非常罕见。