دلیگیت (Delegate) چیست و چگونه می توان یک Delegate ایجاد کرد

فلسفه وجودی Delegate
بطور معمول وقتی شما یک فرمول ریاضی دارید ، می توانید از راه های مختلف آن را حل کنید و یا اینکه با گذاشتن مقادیر مختلف در یک فرمول خاص همیشه به یک جواب برسید . در حالت اول وقتی برای یک فرمول راه حل های مختلفی وجود دارد و یا اینکه پاسخ یک فرمول فقط و تنها فقط در این حالت خاص از یک روش خاص محاسبه می شود نیاز است تا کاربر روش خاص را مشخص کند و پس از تعیین ورودی های فرمول اعداد را جایگزین کرده و فرمول را با مشخصات آن حل کند ، به زبان ساده تر می توان گفت وقتی که بخواهیم روش انجام یک فرآیند را که در یک چارچوب مشخص انجام می شود ، کاربر تعیین کند ، باید به فرآیند مان که یک روال مشخص دارد یک زیرروال اضافه کنیم که آن زیرروال را کاربر تعیین کرده ، تا نه فرآیند به مشکل بخورد و نه درخواست کاربر نادیده گرفته شود . برای حل این مشکل در دنیای برنامه نویسی Delegate ها بوجود آمدند .

Delegate چیست ؟
ِDelegate درواقع یک متد است که مانند یک نوع داده ( مثل int ) برای ارسال به متدهای مختلف استفاده می شود .
دلیگیت ها از خودشان چیزی ندارند و هر جای پروژه که تعریف بشوند در تمامی پروژه قابل مشاهده هستند . هر کسی می تواند مقدار دلخواهش را برای دلیگیت بفرستد . ( به مطالب پایین دقت کنید )

چگونگی ایجاد یک Delegate
برای ایجاد یک Delegate ابتدا باید نام و مقدار باز گشتی Delegate را مشخص کنید . این کار باید در سطح کلاس انجام شود به این معنی که شما نمی توانید یک Delegate را در داخل یک کلاس تعریف کنید و باید آن را خارج از کلاس و در سطحی برابر با سطح کلاس اقدام به ایجاد آنها کنید . برای مثال :

پس از اینکه نام دلیگیت ، ورودی ها و خروجی آن را مشخص کردید باید دلیگیت را به عنوان ورودی به متد دلخواهتان بفرستید برای این کار باید مثل یک پارامتر ساده ، دلیگیت را صدا کنید ، مثلا اگر برای گرفتن یک پارامتر عددی می نویسید int i برای گرفتن دلیگیت باید نام دلیگیت و اسمی که می خواهید در متد از آن استفاده کنید را مشخص کنید برای مثال

namespace Calculator

{

     delegate int operation(int a, int b);

     class calc

     {

          int oper(int i , int j , operation o)

          {

               int z = 0;

               return z = o(i, j);

          }

     }

}

در متد Oper بالا دو ورودی i و j و نیز یک دلیگیت از نوع Operation که بالاتر تعریف کردیم با نام O از ورودی دریافت شده است پس از ، در داخل متد Oper یک متغیر با نام Z تعریف کردیم و بعد از آن مقدار برگشتی تابع دلیگیت را که بالاتر از نوع int ( نوع برگشتی ) تعریف کردیم داخل Z ریختیم . و برای دو پارامتر ورودی که دلیگیت ما می گرفت ، دو متغیر i و j را که از ورودی گرفته بودیم به O فرستادیم . تا اینجا هیچ چیزی مشکل ندارد بجز اینکه وقتی به دستور O می رسیم چه اتفاقی خواهد افتاد ؟ بجای O چه چیزی اجرا خواهد شد ؟ برای پاسخ به این سوال کمی صبر کنید .

فرض کنید که در برنامه تان متدهای بسیار زیادی دارید که دو ورودی int از کاربر دریافت می کنند و یک خروجی int تولید می کنند مثلا متدهای زیر را در نظر بگیرید .

int doSum(int i, int j)

{

     return i + j;

}

public int dosub(int i, int j)

{

     return i – j;

}

public int doMul(int i, int j)

{

     return i * j;

}

public int doDiv(int i, int j)

{

     return i / j;

}

متدهای بالا می توانند در هر کلاسی باشند هم در کلاسی که متد Oper تعریف شده و هم در کلاسی که بعدا متد Oper را صدا می کنیم و یا در کلاس دیگری که در جایی که کلاس Oper ایجاد شده (new) آن کلاس هم new شده .

اما اتفاقی که هنگام رسیدن به دستور O خواهد افتاد . فرض کنید در کلاس x کلاس calc که متد Oper در آن قرار دارد new شده است . و می خواهیم در کلاس x از متد Oper استفاده کنیم . برای این کار باید به روش زیر عمل کنیم .

C = new calc ();

int a= 8,b=9;

C.oper(a, b, anotherClassInstanceContainSumMethod.doSum);

همانطور که ملاحظه می کنید دو متغیر a و b که بالاتر مقداردهی شده اند به متد Oper فرستاده شدند و برای اجرای دستور O که بالاتر سوال آن مطرح شد , در این حالت دستور doSum درنظر گرفته شد که در کلاس دیگری قرار دارد که متدهایی در آن وجود دارد . توجه کنید که همین مقادیر a و b برا اجرا به متد doSum که در کلاس Oper با نام O شناخته می شد ارسال خواهند شد . شما هنگام مقداردهی به متد می توانید از هر متد دیگری که delegate شما را ( از نوع ورودی و نوع خروجی ) پشتیبانی می کند ، استفاده کنید .

گرچه مثالی که زده شد مثال خیلی سطح پایینی است و اصولا از دلیگیت ها اصلا در این موارد استفاده نمی شود اما به شما کمک می کند که درک صحیحی از نحوه پیاده سازی Delegate ها پیدا کنید . در مطالب بعدی مکان های صحیحی استفاده از Delegate را ذکر خواهم کرد .

5 Responses to دلیگیت (Delegate) چیست و چگونه می توان یک Delegate ایجاد کرد

  1. Amini says:

    مرسی ،مفهوم delegate رو خیلی خوب توضیح دادید .

  2. محسن نیک زاده says:

    سلام ممنون خیلی خوب بود من اینطور فهمیدم که هرموقع بخوای یک تابع رو بعنوان پارامتر بفرستی باتوجه به کاری که مدنظرت هست از دلیگیت استفاده میکنی

  3. hessam says:

    واقعا عالی بود

  4. mahvash says:

    mer30, kheili khub bud

  5. ممنون از مقاله مفید
    اگر تمایل به تبادل لینک داشتید ادرس سایت من :
    http://www.ostovarit.com
    به نام فناوری اطلاعات استوار
    با تشکر

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: