آموزش Delegate

سه شنبه 17 اردیبهشت 1392

آموزش Delegate <br/> (آموزش Delegate در سه بخش ارائه شده که این سه بخش در ادامه یکدیگر می باشند.) <br/> به این مطلب فکر کنید که در حال حاضر چگونه از متدها استفاده می کنید. الگوریتمی می نویسید که مقادیر یک سری متغیر را دستخوش تغییر قرار می دهد وآنرا مستقیماً توسط صدا کردن نامش صدا می زنید.

 

(آموزش Delegate در سه بخش ارائه شده که این سه بخش در ادامه یکدیگر می باشند.)

به این مطلب فکر کنید که در حال حاضر چگونه از متدها استفاده  می کنید. الگوریتمی می نویسید که مقادیر یک سری متغیر را دستخوش تغییر قرار می دهد وآنرا مستقیماً توسط صدا کردن نامش صدا می زنید. حال اگر الگوریتمی بخواهید بسیار انتعطاف پذیر و دارای قابلیت استفاده مجدد و بخواهید توابع هر زمانی که لازم می باشند اجرا گردند چه می کنید ؟ بعلاوه این الگوریتم فقط با یک سری از انواع داده سازگار است اما شما می خواهید که الگوریتم تان برای هر نوع داده ای کار برد داشته باشد اگر ندانید که انواع داده ای چه هستند چگونه می توانید عملیات مقایسه را انجام دهید؟ حتما می گویید از  if then else یا switch case استفاده میکنیم در صورتیکه این دستورات نیز برای انواع داده ای شناخته شده کاربرد دارند راه حل دیگر این است که از interfaceبرای تمامی انواعی که می خواهند الگورتم خاصی را داشته باشند استفاده نماییم که واقعا راه حل خوبی است.

البته به این علت که ما در اینجا می خواهیم درباره delegate ها صحبت نماییم از راه حل بالا صرف نظر می کنیم و از همان delegate ها که بسیار سریع و بدون هزینه هستند استفاده می نماییم.

 

برای حل این مسئله می توانید یک delegate را به الگوریتم خود بفرستید و به  متد در برگیرنده  delegate این اجازه را بدهید که عملیات مقایسه را انجام دهید. مانند مثال زیر :  

 
اولین کاری که این برنامه انجام می دهد تعریف یک delegate است . تعریف  delegate ها خیلی شبیه تعریف متدهاست به جز آنکه delegate ها دارای modifier خاص خودشان یعنی delegate هستند و در انتها با ;پایان می یابند و هیچ پیاده سازی ای ندارند.
 
این تعریف delegate تعیین کننده یک delegate handler است که این delegate می تواند به آن اشاره نماید. متد delegate handler برای Comparer delegate می تواند هر نامی داشته باشد اما حتما باید دو پارامتر از نوع object داشته باشد و یک مقدار صحیح  int به عنوان خروجی بر گرداند برای مثال :
 
برای استفاده از delegate باید یک instance از آن گرفت. این کار همانند نمونه گیری از یک class صورت می گیرد همراه با یک پارامتر که delegate را مشخص می کند.  مثال:
 
حال delegate، cmp به عنوان یک پارامتر به تابع sort() فرستاده می شود. مثال :
 
با استفاده از این متد هر delegate handler ی را میتوان به متد sort() ارسال کرد.
برنامه های قدیمی که اصطلاحاً به آنها برنامه های تحت کنسول گفته می شد، همیشه منتظر زدن یک کلید یا نوشتن دستوری و سپس فشردن دکمه Enter توسط کاربر بودند. زمانیکه این اتفاق رخ می داد برنامه یا به سر خط می رفت یا اینکه از محیطی خارج می شد و به محیط قبلی بر می گشت. این پروسه جواب می داد اما خیلی دست کاربر در آن باز نبود و کاربران فقط می توانستند در یک مسیر حرکت کنند – مسیری که برنامه نویس برای آنها مقرر کرده بود- از طرف دیگر برنامه های مدرن (اصطلاحاً GUI) در محیطی رویداد گرا عمل می کنند. به این ترتیب که پشت هر رویدادی ماژولی نوشته شده که پس از فعال شدن رویداد آن ماژول به اجرا در می آید. در برنامه های تحت ویندورز یک سیستم polling[1] وجود ندارد همچنین منابعی برای داشتن یک چرخه که وظیفه سرکشی برای ورودی مصرف نمی شود. تمام این کارها با استفاده از سیستم رویداد انجام می شود.
یک رویداد C# عضوی از کلاسی است که پس از اتفاق افتادن کاری خاص فعال می شود. هر قسمت از برنامه که علاقه مند به فعال شدن رویدادی است، برای آن ثبت نام می کند تا زمانیکه آن رویداد اتفاق افتاد او را مطلع سازند. هر زمان که رویدادی حادث می شود متدهایی که برای آن رویداد از قبل ثبت نام کرده بودند صدا زده می شوند.
رویداد ها و Delegate ها برای بالا بردن کارایی سیستم دست دست هم فعالیت می کنند. شروع این فعالیت تعریف یک رویداد در کلاس می باشد. هر کلاسی که در برگیرنده کلاسی است که رویداد در آن تعریف شده می تواند متد هایش را برای آن رویداد ثبت نام کند. این کار از طریق Delegate صورت می پذیرد به این ترتیب که یک Delegate تعریف می شود تا نشانی از متد را برای رویداد ثبت نماید. این Delegate می تواند یکی از Delegate های از پیش تعریف شده .Net باشد یا یکی که خودتان تعریفش کرده اید. کد زیر چندین روش برای این کار ارائه می دهد:
 

نکته:  حتما قبل از اجرای این برنامه یک ارجاع به System.Drawing.dll  و System.Windows.Forms.dll بدهید.

 

حتماً متوجه شده اید که کد بالا یک برنامه تحت ویندوز است. اگر چه من در اینجا زیاد درباره برنامه های تحت ویندوز صحبت نکرده ام اما برای آشنایی بیشتر بعضی از قسمت های کد را توضیح می دهم.

 

کلاس Eventdemo از Form، ارث بری می نماید. پس می تواند از تمام ویژگیهای فرم های ویندوز از قبیل ماکزمایز و مینیمایز شدن داشتن عنوان و ... استفاده نماید. برای اجرا شدن برنامه های دارای فرم باید متد Run() از شیی استاتیک Application صدا زده شود.

 

حال بهتر است نگاهی به رویداد سفارشی بیاندازیم. در زیر تعریف آن آورده شده است. همانطور که مشاهده می شود یکی از اعضای کلاس Eventdemo می باشد. که شامل کلمه کلیدی event، یک Delegate و نام رویداد می‌باشد.

 

هر کسی که به این رویداد علاقه مند است می تواند از طریق Delegate به آن اتصال برقرار نماید. در اینجا توسطDelegate به نام StartDelegate که خودمان تعریفش کرده ایم می خواهیم به رویداد متصل شویم. با دستور =+ می توان یک Delegate را برای رویدادی ثبت کرد. برای خارج کردن Delegate از لیست ثبت نامی ها از دستور =- می توان استفاده نمود.

 

برای فعال کردن یک رویداد دقیقاً مثل صدا کردن یک متد رفتار می نماییم:

 

روش بالا از ابتدا یک روند اتصال به رویداد را با تعریف Delegate و رویداد به شما نشان داد. ولی در برنامه نویسی معمولاً ما از رویداد ها و Delegate های از پیش تعریف شده استفاده می نماییم. برای مثال خط زیر به ما نحوه اتصال Delegate از پیش تعریف شده EventHandler را به رویداد Button Click نشان می دهد.

 

رویداد Click در کلاس Button نوشته شده است، از طرفی EventHandler هم بعنوان یک Delegate در کتابخانه.Net پیاده سازی گردیده. تنها کاری که ما باید انجام دهیم نوشتن متدی است که به هنگام فعال شدن رویداد باید اجرا شود یعنی OnClickMeClicked.

 

از آنجایی که بسیاری از رویدادها و Delegate ها در کتابخانه .Net موجود می باشند. قبل از اینکه شروع به نوشتن رویداد جدید یا Delegate خاصی کنید بهتر است که یک نگاهی به کتابخانه .Net بیاندازید.

 

منبع:

http://www.csharp-station.com/Tutorials/Lesson14.aspx

 

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 1k بازدید
  • 0 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

تاکنون هیچ کاربری از این پست تشکر نکرده است

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید