为什么sub不能同时实现接口和处理事件?
以下是我的语法错误:
Sub MySub() Handles MyButton.Click Implements MyInterface.MyMethod
End Sub
我知道我可以用另一种方法处理这种逻辑,但这不是重点。我只是想了解这背后的原因。
答案 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)
这是另一个原因,为什么 能够实现接口中定义的方法的事件处理程序方法非常罕见。