У меня проблемы с тем, чтобы обернуться вокруг событий и их обработчиков в целом. Я работал над некоторым примером кода, который их использовал, и я не могу понять, зачем использовать событие, а не просто использовать подпрограмму. Я абсолютно уверен, что мне не хватает большей картины здесь.
Пример сокращенного кода:
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
И я был прав, мне не хватало большей картины. Написание всего кода в одном месте помогло мне точно увидеть, что происходит. Надеюсь, я прав:
Событие позволяет классу сказать «Делай что-нибудь, когда это происходит» очень двусмысленным образом, оставляя класс, который создал Объект, для определения Обработчика; каким должно быть это действие. Этот обработчик может и, скорее всего, будет уникальным для каждого экземпляра класса.
Мне кажется, что это, вероятно, было бы достижимо (на базовом уровне) с помощью индексации и перечисления, но это могло бы запутаться и стать большим количеством кода для написания довольно быстро. Вероятно, это гораздо более гибкий и расширяемый способ обработки вещей.
Я собираюсь опубликовать это в любом случае, в надежде, что я заставлю кого-то сказать мне, верен ли я в своих наблюдениях или я совершенно не прав, и что это поможет кому-то еще, у кого возникли проблемы с этой концепцией, как они погружают свои пальцы в ООП и управляемые событиями объекты.