繁体   English   中英

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

[英]Why can't a sub implement an interface and handle event at the same time?

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

以下是我的语法错误:

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

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

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

SubDeclaration :: =
[Attributes] [ProcedureModifier +] SubSignature [HandlesOrImplements] LineTerminator

End Sub StatementTerminator

HandlesOrImplements :: = HandlesClause | ImplementsClause

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


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

我从未见过有关为什么这个决定是由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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM