Salah satu implementasi dari delegate ialah membuat event handler yang menangani event dengan signature yang telah ditentukan. Delegate merupakan sebuah type. Implementasi lain dari delegate ialah Callback mechanism. Namun pada artikel kali ini saya akan membahas implementasi delegate untuk event dan event handler.
Bayangkan anda mempunyai sebuah class. Di dalam class tersebut terdapat sebuah property dimana proses assignment valuenya harus divalidasi dengan sebuah rule tertentu, lalu anda ingin propagate notifikasi ke user jika validasinya tidak valid berupa message errornya. Ok...mari kita buat class yang sederhana :
Public Class Order
Private mQty As Integer
Public Property Quantity() As Integer
Get
Return mQty
End Get
Set(ByVal value As Integer)
mQty = value
End Set
End Property
End Class
Misalkan aplikasi punya rule bahwa untuk memberikan nilai pada properti Quantity valuenya harus lebih besar nol, lalu notifikasi error message nya kita deliver ke user bila rule tersebut tidak dipenuhi. Bagaimana langkah2nya? Pertama buat terlebih dahulu delegate object nya :
Public Class Order
Private Delegate Sub MyDelegateSub(ByVal Message As String)
Delegate yang saya buat signature nya berupa sebuah Sub yang memiliki satu buah input parameter dengan tipe data string. Langkah kedua buat event yang kita definisikan sendiri namanya dimana event handler yang akan dibuat nantinya harus sesuai dengan signature delegate diatas :
Public Class Order
Private Delegate Sub MyDelegateSub(ByVal Message As String)
Private Event MustBeGTZero As MyDelegateSub
Langkah berikutnya buat event handler nya. Ingat syarat diatas :
Public Class Order
Private Delegate Sub MyDelegateSub(ByVal Message As String)
Private Event MustBeGTZero As MyDelegateSub
Private Sub MustBeGTZeroHandler(ByVal Notification As String)
MsgBox(Notification)
End Sub
Signature event handler sama dengan delegate (berupa Sub dengan satu buah input parameter yang bertipe data string, untuk nama input parameternya ga harus sama).
Next step is, lakukan proses validasi pada Setter property. Disini kita harus lakukan assignment event handler dengan event secara run time, raise event, setelah itu disassociate event handler dengan eventnya, berikut code lengkapnya :
Public Class Order
Private Delegate Sub MyDelegateSub(ByVal Message As String)
Private Event MustBeGTZero As MyDelegateSub
Private Sub MustBeGTZeroHandler(ByVal Notification As String)
MsgBox(Notification)
End Sub
Private mQty As Integer
Public Property Quantity() As Integer
Get
Return mQty
End Get
Set(ByVal value As Integer)
If value <= 0 Then
AddHandler MustBeGTZero, AddressOf MustBeGTZeroHandler
RaiseEvent MustBeGTZero("Input harus lebih besar dari Nol")
RemoveHandler MustBeGTZero, AddressOf MustBeGTZeroHandler
Else
mQty = value
End If
End Set
End Property
End Class
Untuk trigger event yang telah kita buat gunakan perintah RaiseEvent. Berikut contoh penggunaannya di aplikasi client :
Private Sub btnGetOrder_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnGetOrder.Click
Dim myOrder = New Order With {.Quantity = -1}
End Sub
Kembali saya menggunakan VB 9.0. Kode diatas menggabungkan fitur Local Type Inference dengan Object Initialization Expression. Screen shot nya seperti dibawah ini :
Happy Coding VB-ers !! ;)