دلیگیت های آزاد - Unbound Delegates
در پست های قبل دلیگیت هایی که تعریف کردیم از نوع "دلیگیت های محدود" یا Bound Delegates بودند، زیرا آنها مجموعه ی ثابتی از توابع را در لیست فراخوانی خود داشتند. یک دلیگیت "نامحدود" یا "آزاد" به تابعی وهله ای (Instance) اشاره می کند که دارای لیست پارامتر مشخص شده و نوع بازگشتی برای یک نوع شی مشخص شده است. بنابراین یک دلیگیت یکسان میتواند برای فراخوانی توابع وهله ای برای هر شی مشخص شده به کار رود. در زیر نمونه ای از تعریف یک دلیگیت آزاد را مشاهده می کنید.
public delegate void HANDLER (HandlerClass^ , int value);
اولین آرگومان نوع اشاره گر this را مشخص می کند، برای اینکه یک دلیگیت از نوع HANDLER بتواند یک تابع وهله ای (غیر استاتیک) را فراخوانی کند. این تابع باید یک آرگومان از نوع int و نوع بازگشتی void داشته باشد. بنابراین یک دلیگیت از نوع HANDLER تنها میتواند یک تابع برای یک شی از کلاس HandlerClass را فراخوانی کند ولی برای هر شی از این نوع. این ممکن است کمی محدود کننده به نظر برسد ولی در بسیار مفید خواهد بود. فرض کنید HandlerClass ساختاری مشابه زیر دارد ...
ref class HandlerClass
{public:
// constructors ...
....
// functions
void Function1 (...)
{// do something}
void Function2 (...)
{// do something}
...
}
میتوان یک دلیگیت از نوع HANDLER را به صورت زیر ایجاد کرد:
HANDLER^ handler = gcnew HANDLER (&HandlerClass::Function1);
هنگامی که یک دلیگیت آزاد را فراخوانی می کنید، اولین آرگومان، شی مشخص کننده ی توابعی از لیست است که باید فراخوانی شوند و آرگومان های بعدی، آرگومان های آن توابع هستند. برای مثال شاید بخواهید دلیگیت handler را به صورت زیر فراخوانی کنید.
HandlerClass^ obj = gcnew HandlerClass ("parameters");
handler (obj, "value");
اولین آرگومان یک هندل به شی کلاس HandlerCalss است که شما با ارسال پارامتر ها به سازنده کلاس، ایجاد کردید که تعداد آنها بسته به تعریف سازنده است. دومین ارگومان مقداری است که به تابع موردنظر ارسال می کنید.
دلیگیت های آزاد را نیز میتوان با استفاده از عملگر های + و - در یکدیگر ادغام یا از یکدیگر تفکیک کرد. برای مثال بالا فرض کنید که بخواهید تابع دیگری از کلاس را به لیست دلیگیت اضافه کنید. با استفاده از عملگر + این کار به صورت زیر امکان پذیر است.
handler += gcnew HANDLER (&HandlerClass::Function2);
+ نوشته شده در پنجشنبه نوزدهم بهمن ۱۳۹۱ ساعت 17:51 توسط MEC
GENERAL INFORMATION