Bagikan melalui


Delegasi (Visual Basic)

Delegasi adalah objek yang merujuk 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 menaikkan peristiwa dapat memanggil penanganan aktivitas yang berbeda dalam keadaan yang berbeda. Sayangnya, objek yang memunculkan acara tidak dapat mengetahui sebelumnya handler acara mana yang menangani acara tertentu. Visual Basic memungkinkan Anda mengaitkan penanganan aktivitas secara dinamis dengan peristiwa dengan membuat delegasi untuk Anda saat Anda menggunakan pernyataan tersebut AddHandler . Pada waktu proses, delegasi meneruskan panggilan ke penanganan aktivitas yang sesuai.

Meskipun Anda dapat membuat delegasi Anda sendiri, dalam kebanyakan kasus Visual Basic membuat delegasi dan mengurus detail untuk Anda. Misalnya, Event sebuah pernyataan secara implisit mendefinisikan kelas delegasi bernama <EventName>EventHandler sebagai kelas dalam dari kelas yang berisi Event pernyataan, dan dengan tanda tangan yang sama dengan event. Pernyataan AddressOf secara implisit membuat contoh dari delegasi yang mengacu pada prosedur tertentu. Dua baris kode berikut 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 sudah ada sebagai delegasi dasarnya. Sintaks berikut menunjukkan caranya:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

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

Mendelegasikan Variabel dan Parameter

Anda dapat menggunakan deleget untuk tugas lain yang tidak terkait dengan peristiwa, seperti penguliran bebas atau dengan prosedur yang perlu memanggil versi fungsi yang berbeda saat waktu eksekusi.

Misalnya, Anda memiliki aplikasi iklan klasifikasi 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 mencantumkan tahun mobil sebelum merek mobil. Masalahnya adalah bahwa fungsionalitas pengurutan bawaan dari kotak daftar hanya mengurutkan menurut kode karakter; ini menempatkan semua iklan yang dimulai dengan tanggal terlebih dahulu, diikuti oleh iklan yang dimulai dengan mereknya.

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

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 nama yang ditentukan yang tanda tangannya cocok dengan tanda tangan kelas delegasi. methodName dapat berupa metode bersama atau metode instans. methodName bukan pilihan, bahkan jika Anda membuat delegasi untuk metode bawaan kelas.

Untuk menentukan ekspresi lambda, gunakan sintaks berikut:

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

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

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

Penandatangan fungsi harus sesuai dengan tipe delegasi. Untuk informasi selengkapnya tentang ekspresi lambda, lihat Ekspresi Lambda. Untuk lebih banyak contoh ekspresi lambda dan AddressOf penugasan kepada delegasi, lihat Konversi Delegasi Yang Dilonggarkan.

Judul Deskripsi
Cara: Memanggil Metode Delegasi Memberikan 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.
Konversi Delegasi Yang Dilonggarkan Menjelaskan bagaimana Anda dapat menetapkan subs dan fungsi untuk mendelegasikan atau menangani bahkan ketika tanda tangan mereka tidak identik
Peristiwa Menyediakan gambaran umum peristiwa di Visual Basic.