Delegate เป็นการทำ reference to function หรือเป็นตัวแทนของฟังก์ชันได้
ตัวแปร delegate จึงสามารถกำหนดไปชี้ไปยังฟังก์ชั่นไหนก็ได้
ที่มีรูปแบบ arguments และ return data type ที่เหมือนกัน เช่น

CODE
Delegate Function MathOperation(a As Double, b As Double) As Double


เป็นการกำหนดว่ามี delegate ตัวหนึ่งชื่อ MathOperation
ที่มี function signature ที่รับ argument ชนิด double สองตัว
และให้ผลลัพธ์คืนค่าเป็น double ด้วย

ต่อมาเขียนโค้ดว่า

CODE
Private SelectedOperation As MathOperation

หมายถึงว่าตัวแปร SelectedOperation จะใช้ชี้ไปหาฟังก์ชั่นใดๆ ก็ได้ที่
มี function signature เหมือนที่กำหนดไว้ที่ delegate MathOperation

ผมอาจจะมีฟังก์ชั่นบวกเลข เช่น

CODE
Private Function Add(v1 As Double, v2 As Double) As Double
   Return(v1 + v2)
End Function


ก็จะเขียนโค้ดเช่นนี้ได้

CODE
SelectedOperation = AddressOf Add ‘ —- #1


และเขียนต่อไปว่า

CODE
Dim result As Double = SelectedOperation(10, 20) ‘ —- #2


ตัวแปร result ก็จะมีค่าเป็น 30
เพราะการเรียก SelectedOperation จริงๆ แล้ว
ก็ถูกส่งต่อไปเรียกฟังก์ชั่น Add

ถ้าเราอยากเปลี่ยน algorithm
โค้ด #2 ก็ไม่ต้องเปลี่ยนโค้ดเลย เช่น

CODE
SelectedOperation = AddressOf Multiply
Dim result As Double = SelectedOperation(10, 20) ‘ —- คราวนี้ได้ 200

ศึกษาต่อจากตัวอย่างโค้ดนี้ครับ

Download Sample: http://GreatFriends.Biz/Files/ExDelegate.rar

ข้อสรุปที่น่าสังเกต:
Delegate เป็นการกำหนด Interface (รูปแบบการติดต่อเรียกใช้โค้ดใดๆ)
ที่ทำให้เราเขียนโค้ดที่อิง Interface เป็นหลัก
และสามารถเปลี่ยน Implementation (ส่วนทำงานของโค้ด) ได้ในขณะรัน
หรือเป็น Polymorphism ในระดับฟังก์ชั่น

หมายเหตุ
Delegate ใช้กับ Sub หรือ Property procedure ก็ได้นะครับ