如何使用VB.NET中的接口处理事件?

如何使用VB.NET中的接口处理事件?,vb.net,interface,Vb.net,Interface,我不熟悉接口,我正在努力了解它们是如何工作的 我编写了以下代码,除了没有触发的click事件外,这些代码正常工作 Public Class Form1 Dim WithEvents Button As IClass = New MyButton Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button.

我不熟悉接口,我正在努力了解它们是如何工作的

我编写了以下代码,除了没有触发的click事件外,这些代码正常工作

Public Class Form1
    Dim WithEvents Button As IClass = New MyButton

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button.Parent = Me
    End Sub

    Public Sub ClickEventHandler(ByVal Sender As Object, ByVal E As EventArgs) Handles Button.Click
        MsgBox("Piwpiw !")
    End Sub
End Class

Public Interface IClass
    Event Click(ByVal Sender As Object, ByVal E As EventArgs)
    Property Parent
End Interface

Public Class MyButton
    Inherits SimpleButton
    Implements IClass

    Public Event click1(ByVal Sender As Object, ByVal E As System.EventArgs) Implements IClass.click

    Public Property Parent1 As Object Implements IClass.Parent
        Get
            Return MyBase.Parent
        End Get
        Set(ByVal value As Object)
            MyBase.Parent = value
        End Set
    End Property
End Class
那代码怎么了


(注:这只是一个让我理解接口如何工作的示例,没有任何功能意义。)

在您的示例代码中,我没有看到引发事件的行。为了能够在事件处理程序中处理事件,MyButton类中有一个引发事件的点,即:

Public Class MyButton
    Inherits SimpleButton
    Implements IClass

    Public Event click1(ByVal Sender As Object, ByVal E As System.EventArgs) Implements IClass.click

    Public Property Parent1 As Object Implements IClass.Parent
        Get
            Return MyBase.Parent
        End Get
        Set(ByVal value As Object)
            MyBase.Parent = value
        End Set
    End Property

    Public Sub SimulateClick()
        RaiseEvent click1(Me, New System.EventArgs())
    End Sub

End Class
您可以使用该语句引发事件。
当然,上面的示例假设在代码中的某个时刻,您调用SimulateClick而不是真正的鼠标单击(这将涉及绘制按钮并对几个鼠标事件作出反应)。一旦引发事件,将调用处理程序。您可以通过Form1\u加载方法执行此操作:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Button.Parent = Me
    Button.SimulateClick()
End Sub
我注意到您的
MyButton
类派生自
SimpleButton
类。除了使用SimulateClick方法之外,您还可以对
SimpleButton
类中的单击作出反应,并将
RaiseEvent
语句放在那里。

以下是解决方案:

将MyButton类替换为:

Public Class MyButton
    Inherits SimpleButton
    Implements IClass

    Public Shadows Event click(ByVal Sender As Object, ByVal E As System.EventArgs) Implements IClass.Click

    Public Property Parent1 As Object Implements IClass.Parent
        Get
            Return MyBase.Parent
        End Get
        Set(ByVal value As Object)
            MyBase.Parent = value
        End Set
    End Property

    Public Sub ClickEventHandler(ByVal Sender As Object, ByVal E As EventArgs) Handles     MyBase.Click
        RaiseEvent click(Sender, E)
    End Sub
End Class

MyButton
类中缺少一个方法来实现此功能

你需要这个:

Private Sub MyButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click
    RaiseEvent click1(sender, e)
End Sub

本质上,
SimpleButton
已经有了一个click方法。当您单击派生的
MyButton
类时,它将被引发。但是
SimpleButton
上的
Click
事件与
IClass
界面上的
Click
事件不同。您将其实现为
单击1
。因此,当提升
Click
方法时,您只需要提升
click1
方法。因此采用了上述方法。

好吧,这就是我的问题:假设一个类有自己的事件,并根据自己的逻辑触发,如何分配一个接口并通过接口捕获这些事件?MyButton类实际上是从SimpleButton类派生的。这没有什么意义,但只是一个简单的例子。我真正的代码非常复杂,这就是为什么我尝试用这几行代码来复制它。