اعلان نوع وکالتی (delegate)
همونطوری که در ابتدای بخش قبل گفتم، delegate ها "نوع" هستند، درست مثل کلاس ها که نوع هستند. و مشابه کلاس ها باید قبل از اینکه بتوانید از delegate ها استفاده کنید متغیرها و اشیاء از همان نوع را بسازید. مثال زیر طرز اعلان نوع وکالتی را نشان می دهد:
delegate void MyDel(int x);
اعلان یک نوع وکالتی شباهت بسیار زیادی به اعلان یک متد دارد به این دلیل که در داخل نوع وکالتی هم امضا و نوع برگشتی وجود دارد. این امضا و نوع برگشتی قالب متدهایی که وکیل قبول می کند را مشخص می کند.
در مثال قبل مشخص شده که شیئ وکالتی از نوع MyDel فقط متدهایی که دارای تنها یک پارامتر از نوع int بوده و نوع برگشتی ندارند را قبول می کند. شکل زیر در سمت چپ نوع وکالتی، و در سمت راست شیئ وکالتی را نشان می دهد.
اعلان نوع وکالتی با اعلان متد، از دو جهت تفاوت دارد. اعلان نوع وکالتی
- با کلمه کلیدی delegate شروع می شود
- دارای بدنه متد نمی باشد
نکته
هرچند اعلان نوع وکالتی شبیه اعلان متد است، نیازی نیست که آنرا در داخل یک کلاس اعلان کنید، زیرا خودش "نوع" است.
ساختن شیئ وکالتی
یک delegate یک نوع ارجاعی است و بنابراین دارای یک ارجاع و یک شیئ است. بعد از اینکه یک نوع وکالتی اعلان شد، شما می توانید متغیرها را اعلان کرده و شیئی از آن نوع بسازید. کد زیر اعلان یک متغیر از نوع delegate را نشان می دهد:
MyDel delVar;
برای ساختن شیئ وکالتی دو راه وجود دارد. روش اول استفاده از عبارت شیئ-ساز با استفاده از عملگر new است. بصورتی که در کد زیر می بینید. عملوند مربوط به عملگر new شامل موارد زیر است:
- نام نوع وکالتی
- مجموعه ای از پرانتزها که حاوی نام متدی است که به عنوان اولین عضو لیست احضار استفاده می شود. این می تواند متد نمونه و یا متد استاتیک باشد.
delVar = new MyDel( myInstObj.MyM1 ); // Create delegate and save ref.
dVar = new MyDel( SClass.OtherM2 ); // Create delegate and save ref.
شما همچنین می توانید از شیوه املایی کوتاه شده، که فقط شامل تعیین کننده متد است استفاده کنید. همانطور که در کد زیر میبینید. این کد و کد قبل از لحاظ معنایی برابر هستند. استفاده از املاء کوتاه شده مشکلی بوجو نمی آورد، به این دلیل که یک تبدیل ضمنی بین نام متد و نوع وکالتی سازگار انجام می شود.
delVar = myInstObj.MyM1; // Create delegate and save reference.
dVar = SClass.OtherM2; // Create delegate and save reference.
برای مثال کد زیر دو شیئ وکالتی می سازد: یکی با یک متد نمونه و دیگری با یک متد استاتیک. شکل زیر نمونه سازی های delegate ها را نشان می دهد. در این شکل فرض شده که شیئی به نام myInstObj وجود دارد که نمونه ای از یک کلاس است که متدی به نام MyM1 اعلان کرده. این متد مقداری را بازگشت نمی دهد و یک پارامتر از نوع int دارد. در این شکل همچنین فرض بر این است که کلاسی به نام SClass که دارای یک متد استاتیک OtherM2 است وجود دارد. این متد استاتیک دارای نوع بازگشتی و امضای منطبق با وکیل MyDel می باشد.
delegate void MyDel(int x); // Declare delegate type.
MyDel delVar, dVar; // Create two delegate variables.
delVar = new MyDel( myInstObj.MyM1 ); // Create delegate and save ref.
dVar = new MyDel( SClass.OtherM2 ); // Create delegate and save ref.
در کنار تخصیص حافظه برای delegate ، ساختن یک شیئ وکالتی نیز اولین متد را در لیست احضار delegate قرار می دهد.
شما همچنین می توانید با استفاده از مقدار دهی اولیه کننده (initializer) ، متغیر را ساخته و شیئ را در همان بیان نمونه سازی کنید. برای مثال، بیان های زیر تنظیماتی مشابه شکل قبل بوجود می آورند.
MyDel delVar = new MyDel( myInstObj.MyM1 );
MyDel dVar = new MyDel( SClass.OtherM2 );
بیان های زیر از شیوه کوتاه شده استفاده می کنند، اما دوباره نتایج موجود در شکل قبل را تولید می کنند:
MyDel delVar = new MyDel( myInstObj.MyM1 );
MyDel dVar = new MyDel( SClass.OtherM2 );