Vb.net 使用EventHandler的好处

Vb.net 使用EventHandler的好处,vb.net,oop,events,Vb.net,Oop,Events,总的来说,我对事件及其处理程序的理解有困难。我是从使用它们的一些示例代码开始工作的,我不明白为什么要使用事件而不是简单地使用sub。我绝对肯定我错过了这里的大局 缩写代码示例: Public Class MenuEntry Public Event selected as EventHandler(of EventArgs) Protected Friend Overridable Sub onSelectEntry(e as EventArgs) RaiseE

总的来说,我对事件及其处理程序的理解有困难。我是从使用它们的一些示例代码开始工作的,我不明白为什么要使用事件而不是简单地使用sub。我绝对肯定我错过了这里的大局

缩写代码示例:

Public Class MenuEntry
    Public Event selected as EventHandler(of EventArgs)

    Protected Friend Overridable Sub onSelectEntry(e as EventArgs)
        RaiseEvent selected(Me, e)
    End Sub
End Class


Public Class Menu
    Private menuSelect as New inputAction(Keys.Enter)
    Private menuEntry as New List(of MenuEntry)

    'keeps track of which menu item we're currently on
    Private _selectedEntry as Integer

    Public Sub Update()
        If menuSelect.evaluate Then
            onSelectEntry(_selectedEntry)
        End If

        Protected Overridable Sub onSelectEntry(ByVal entryIndex as Integer)
            menuEntry(entryIndex).onSelectEntry(New EventArgs())
        End Sub
    End Sub
End Class


Public Class OptionsMenu
    Inherits Menu

    Private arbitraryOne as Integer
    Private arbitraryTwo as Integer

    Public Sub New()
        Dim entryOne as New MenuEntry(String)
        Dim entryTwo as New MenuEntry(String)

        AddHandler entryOne.selected, AddressOf entryOneSelected
        AddHandler entryTwo.selected, AddressOf entryTwoSelected

        MenuEntry.add(entryOne)
        MenuEntry.add(entryTwo)
    End Sub

    Private Sub entryOneSelected(ByVal entryIndex as Integer)
        arbitraryOne += 1
    End Sub

    Private Sub entryTwoSelected(ByVal entryIndex as Integer)
        arbitraryTwo += 1
    End Sub
End Class
我是对的,我错过了大局。在同一个地方写下所有的代码有助于我了解到底发生了什么。希望我是对的:

事件允许一个类以一种非常模糊的方式说“发生这种情况时做点什么”,让创建对象的类定义一个处理程序;这一行动应该是什么。该处理程序可以而且很可能对类的每个实例都是唯一的

在我看来,这可能通过索引和枚举(在基本层面上)实现,但这会变得混乱,并成为大量代码,需要相当快地编写。这可能是一种更加灵活和可扩展的处理方式


不管怎样,我还是要发布这篇文章,希望有人能告诉我,我的观察结果是否正确,或者完全偏离了基准,这有助于其他在OOP和事件驱动对象中遇到问题的人

是的,你的观察是正确的。事件用于让所有相关方知道发生了什么,如果他们感兴趣,他们可以执行一些不一定是引发事件的类固有的附加操作。

在引发事件时能够运行任意代码是一个重要方面。但是还有一个更大的好处,它大大减少了类之间的耦合。请注意,MenuEntry类根本没有对Menu类的引用。您可以完全重新设计Menu类,而无需在MenuEntry类中进行任何更改。这使得代码具有高度的可组合性


技术术语是观察者模式。这本书是程序员的必备读物。

您在表单上放置了一个
按钮。你如何判断它在没有事件的情况下被点击?首先,我不是在编写windows窗体。这个问题在本质上比任何东西都更具哲学性。但作为对您评论的回应,程序在引发事件时会注意到单击。我没有意识到的是,事件可以根据对象的所有者进行定制。这不是一个知道按钮是否被点击的问题,而是如何处理它。我知道,这只是一个假设。这就是它们的用途。非常好的推荐,在阅读了它的描述和历史之后,我给自己订了一份。这正是让我兴奋的练习和方法。。。以这样一种抽象的方式编写代码,我可以将其用于各种应用程序,即使它们之间的关系很小。我一直在努力创建大约12个独立的“引擎”,它们可以相互交互,但不需要,这样我就有了一个框架来制定我的实际目标。再次感谢你的链接。