Delegasi (Visual Basic)

Delegasi adalah objek yang mengacu pada metode. Mereka kadang-kadang digambarkan sebagai penunjuk fungsi jenis aman karena mirip dengan penunjuk fungsi yang digunakan dalam bahasa pemrograman lainnya. Tetapi tidak seperti penunjuk fungsi, delegasi Visual Basic adalah jenis referensi berdasarkan kelas System.Delegate. Delegasi dapat mereferensikan kedua metode bersama — metode yang dapat dipanggil tanpa instans kelas tertentu — dan metode instans.

Delegasi dan Peristiwa

Delegasi berguna dalam situasi di mana Anda memerlukan perantara antara prosedur panggilan dan prosedur yang dipanggil. Misalnya, Anda mungkin ingin objek yang meningkatkan peristiwa dapat memanggil penanganan aktivitas yang berbeda dalam keadaan yang berbeda. Sayangnya, objek yang menaikkan peristiwa tidak dapat mengetahui sebelumnya penanganan aktivitas mana yang menangani peristiwa tertentu. Visual Basic memungkinkan Anda mengaitkan penanganan aktivitas secara dinamis dengan peristiwa dengan membuat delegasi untuk Anda saat anda menggunakan pernyataan AddHandler. Pada durasi, delegasi meneruskan panggilan ke penanganan aktivitas yang sesuai.

Meskipun Anda dapat membuat delegasi Anda sendiri, dalam banyak kasus Visual Basic membuat delegasi dan mengurus detail untuk Anda. Misalnya, pernyataan Event secara implisit mendefinisikan kelas delegasi bernama <EventName>EventHandler sebagai kelas berlapis dari kelas yang berisi pernyataan Event, dan dengan tanda tangan yang sama dengan peristiwa. Pernyataan AddressOf secara implisit membuat instans delegasi yang mengacu pada prosedur tertentu. Dua baris kode berikut ini adalah setara. Di baris pertama, Anda melihat pembuatan eksplisit instans EventHandler, dengan referensi ke metode Button1_Click yang dikirim sebagai argumen. Baris kedua adalah cara yang lebih nyaman untuk melakukan hal yang sama.

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click

Anda dapat menggunakan cara singkat untuk membuat delegasi di mana saja pengkompilasi dapat menentukan jenis delegasi berdasarkan konteks.

Mendeklarasikan Peristiwa yang Menggunakan Jenis Delegasi yang Sudah Ada

Dalam beberapa situasi, Anda mungkin ingin mendeklarasikan peristiwa untuk menggunakan jenis delegasi yang ada sebagai delegasi yang mendasarnya. Contoh berikut menunjukkan caranya:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

Ini berguna ketika Anda ingin merutekan beberapa peristiwa ke handler yang sama.

Delegasikan Variabel dan Parameter

Anda dapat menggunakan delegasi untuk tugas terkait non-peristiwa lainnya, seperti utas gratis atau dengan prosedur yang perlu memanggil versi fungsi yang berbeda pada durasi.

Misalnya, Anda memiliki aplikasi classified-ad yang menyertakan kotak daftar dengan nama mobil. Iklan diurutkan berdasarkan judul, yang biasanya merupakan buatan mobil. Masalah yang mungkin Anda hadapi terjadi ketika beberapa mobil termasuk tahun mobil sebelum pembuatan. Masalahnya adalah bahwa fungsionalitas pengurutan bawaan dari kotak daftar hanya mengurutkan menurut kode karakter; iklan ini menempatkan semua iklan yang dimulai dengan tanggal terlebih dahulu, diikuti oleh iklan yang dimulai dengan pembuatan.

Untuk memperbaikinya, Anda dapat membuat prosedur pengurutan di kelas yang menggunakan pengurutan alfabet standar pada sebagian besar kotak daftar, tetapi dapat beralih pada durasi ke prosedur pengurutan kustom untuk iklan mobil. Untuk melakukan ini, Anda meneruskan prosedur pengurutan kustom ke kelas pengurutan pada durasi, menggunakan delegasi.

Ekspresi AddressOf dan Lambda

Setiap kelas delegasi mendefinisikan konstruktor yang diteruskan spesifikasi metode objek. Argumen ke konstruktor delegasi harus menjadi referensi ke metode, atau ekspresi lambda.

Untuk menentukan referensi ke metode, gunakan sintaks berikut:

AddressOf [expression.]methodName

Jenis waktu kompilasi expression harus berupa nama kelas atau antarmuka yang berisi metode dari nama yang ditentukan yang tanda tangannya cocok dengan tanda tangan kelas delegasi. methodName dapat berupa metode bersama atau metode instans. methodName tidak bersifat opsional, bahkan jika Anda membuat delegasi untuk metode default kelas.

Untuk menentukan ekspresi lambda, gunakan sintaks berikut:

Function ([parm Sebagai type, parm2 Sebagai type2, ...]) expression

Contoh berikut menunjukkan baik AddressOf dan ekspresi lambda digunakan untuk menentukan referensi untuk delegasi.

Module Module1

    Sub Main()
        ' Create an instance of InOrderClass and assign values to the properties.
        ' InOrderClass method ShowInOrder displays the numbers in ascending 
        ' or descending order, depending on the comparison method you specify.
        Dim inOrder As New InOrderClass
        inOrder.Num1 = 5
        inOrder.Num2 = 4

        ' Use AddressOf to send a reference to the comparison function you want
        ' to use.
        inOrder.ShowInOrder(AddressOf GreaterThan)
        inOrder.ShowInOrder(AddressOf LessThan)

        ' Use lambda expressions to do the same thing.
        inOrder.ShowInOrder(Function(m, n) m > n)
        inOrder.ShowInOrder(Function(m, n) m < n)
    End Sub

    Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 > num2
    End Function

    Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 < num2
    End Function

    Class InOrderClass
        ' Define the delegate function for the comparisons.
        Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        ' Display properties in ascending or descending order.
        Sub ShowInOrder(ByVal compare As CompareNumbers)
            If compare(_num1, _num2) Then
                Console.WriteLine(_num1 & "  " & _num2)
            Else
                Console.WriteLine(_num2 & "  " & _num1)
            End If
        End Sub

        Private _num1 As Integer
        Property Num1() As Integer
            Get
                Return _num1
            End Get
            Set(ByVal value As Integer)
                _num1 = value
            End Set
        End Property

        Private _num2 As Integer
        Property Num2() As Integer
            Get
                Return _num2
            End Get
            Set(ByVal value As Integer)
                _num2 = value
            End Set
        End Property
    End Class
End Module

Tanda tangan fungsi harus cocok dengan jenis delegasi. Untuk informasi selengkapnya tentang ekspresi lambda, lihat Ekspresi Lambda. Untuk contoh selengkapnya tentang ekspresi lambda dan penugasan AddressOf kepada delegasi, lihat Konversi Delegasi Yang Dilonggarkan.

Judul Deskripsi
Cara: Memanggil Metode Delegasi Menyediakan contoh yang menunjukkan cara mengaitkan metode dengan delegasi lalu memanggil metode tersebut melalui delegasi.
Cara: Meneruskan Prosedur ke Prosedur Lain di Visual Basic Menunjukkan cara menggunakan delegasi untuk meneruskan satu prosedur ke prosedur lain.
Melonggarkan Konversi Delegasi Menjelaskan bagaimana Anda dapat menetapkan subs dan fungsi untuk mendelegasikan atau menangani bahkan ketika tanda tangan mereka tidak identik
Peristiwa Memberikan gambaran umum delegasi dalam Visual Basic.