PDA

View Full Version : کاربرد ها و مزایای delegate ها



ali_mnkt
دوشنبه 12 مرداد 1388, 23:38 عصر
با سلام خدمت دوستان و اساتید گرامی

من چند وقتی بود که مشغول بررسی delegate ها در برنامه نویسی بودم جستجو هم کردم

اما فقط دوستان به تعریفی از delegate اکتفا کرده بودن و طریقه بکارگیری اون توی ساخت

event ها رو توضیح داده بودن اما من فکر کنم delegate ها به غیر از event ها در جاها دیگه ای

هم کاربرد های مهمی داشته باشه . به فکر افتادم که این قسمت رو ایجاد کنم تا اگه کسی

اطلاعات بیشتری از delegate ها داره و زمینه های مهم استفاده از اون رو می دونه در اینجا

مطرح کنه چون می دونم خیلی از دوستان در این زمینه کمبود هایی رو احساس میکنند.

بعد از معرفی زمینه های کاربرد اگه یکی از دوستان با تجربه در این زمینه یه سناریو تعریف

کنه و بعد با استفاده از delegate ها شروع به نوشتن کد اون کنه تا هم یه مثال کاربردی

در این زمینه زده شده باشه وهم دوستان دیگه بتونن از تجربه این دوستان در امر

برنامه نویسی شی گرا استفاده کنن . فقط خواهشی که دارم اینه که حدالمکان از سناریوهای

کاربردی که در واقعت کاربردی دارن استفاده بشه. پیشاپیش از دوستانی که در بالا بردن

دانش شی گرایی کمک می کنن تشکر می کنم.

Sociant
سه شنبه 13 مرداد 1388, 17:00 عصر
delegate ها کاربردهای جالب و مهمی دارن که خیلی مفیده. کاربرد اصلیشون پوشش دادن متد هاست و در قالب همین کاربر میشه استفاده های جالبی ازشون کرد.
مثلا:
- اجرای غیرهمگام یا Asynchronous متدها است.



class Class1
{
delegate void SampleDelegate();
private void SampleMethod() { }
public void Main(){
SampleDelegate d = new SampleDelegate(SampleMethod);
d.BeginInvoke(SampleMethodCallback, null);
}
private void SampleMethodCallback(IAsyncResult result) { }
}

-اجرای یک متد در Thread سازنده فرم (برای جلوگیری از تداخل در برنامه نویسی چند نخی)



class Class1
{
delegate void SampleDelegate();
private void SampleMthod() { }
public Class1(Form1 form)
{
if (form.InvokeRequired)
{
SampleDelegate d = new SampleDelegate(SampleMthod);
form.Invoke(d);
}
}
}

-تشکیل مجموعه ای از متدهای با امضای یکسان بدون محدودیت در تعلق داشتن به کلاس خاص(مثلا Dispatcher)



delegate void HandlerDelegate();
class Dispatcher
{
private Dictionary<string,HandlerDelegate> _handlers;
public void AddHandler(string eventt,HandlerDelegate d)
{
_handlers.Add(d);
}
public Dispatcher()
{
_handlers = new Dictionary<string, HandlerDelegate>();
}
public void Dispatch(string eventt)
{
if (_handlers.ContainsKey(eventt))
_handlers[eventt].Invoke();
}
}

-اگر قابلیتی مثل event ها رو لازم داشته باشیم ولی بخواهیم فقط یک متد پذیرفته بشه


delegate void OnFireDetectedDelegate();
class FireDetector
{
private ExampleEventDelegate _exampleEventHandler;
private OnFireDetectedDelegate _onFireDetectedHandler;
public FireDetector(OnFireDetectedDelegate onFireDetectedHandler)
{
_onFireDetectedHandler = OnFireDetectedDelegate;
}
private void DetectFire()
{
if (fireDetected)
_onFireDetectedHandler.Invoke();
}
}


فعلا این چندتا تو ذهنم بود

Amir Oveisi
سه شنبه 13 مرداد 1388, 19:29 عصر
یکی از کاربردهای مهم دیگه استفاده از delegate ها برای ایجاد Anonymous Method هاست که در .NET 3.5 تو LINQ کاربرد فراوانی به شکل Lambda Expression داره.

Unknownlive
سه شنبه 13 مرداد 1388, 21:42 عصر
شما وقتی دارید عملیات پردازش همزمان و غیر همزمان را پیاده سازی میکنید نیاز به Delegate دارید.

hdv212
چهارشنبه 14 مرداد 1388, 01:40 صبح
فکر میکنم این مقاله ی (http://barnamenevis.org/forum/showthread.php?t=117839) من، شما رو تا حدی با Delegate ها آشنا کنه.

Sociant
چهارشنبه 14 مرداد 1388, 10:56 صبح
راستی دوتا تکنیک خیلی خیلی جالب در رابطه با delegate ها هست که یادم رفت خدمتتون عرض کنم :

1-Covariance
این تکنیک روی نوع بازگشتی متد ها تمرکز داره. طبق این تکنیک متدهایی که امضای یکسانی با امضای تعریف شده در delegate دارند می توانند نوع بازگشتیشان متفاوت از Delegate باشد اما این نوع بازگشتی باید زیر نوعی از نوع تعریف شده در Delegate باشد.




Class Mammal{}
Class Dog : Mammal{}
delegate Mammal SampleDelegate();


public Dog SampleDogMethod(){}


-----
SampleDelegate d = new SampleDelegate(SampleDogMethod);
-----


2- Contravariance
طبق این تکنیک، متدهایی که نوع پارامترهای ورودیشان والد نوع پارامترهای ورودی مشخص شده در Delegate باشد، در Delegate پذیرفته می شود.




Class Mammal{}
Class Dog : Mammal{}
delegate void SampleDelegate(Dog dog);


public void SampleMammalMethod(Mammal mammal){}


-----
SampleDelegate d = new SampleDelegate(SampleMammalMethod);
---

ali_mnkt
پنج شنبه 15 مرداد 1388, 00:31 صبح
فکر میکنم این مقاله ی (http://barnamenevis.org/forum/showthread.php?t=117839) من، شما رو تا حدی با Delegate ها آشنا کنه.


واقعا مقاله جالبی بود . اگر در مورد event ها هم مقاله ای دارید لطف کنید قرار بدید تا بقیه

هم استفاده کنند.

از دوست عزیزم (sociant) برای مطالب جالبش تشکر می کنم.


خوب من یک سئوال دارم :

1- همون طور که دوست عزیز مون sociant گفتن یکی از کابرد های delegate ها در ساخت

event هست . خوب ما می دونیم که از delegate ها برای فراخوانی غیر همزمان چند متد

استفاده می شه . خوب یک event که نیاز به یک متد برای انجام وظیفش داره پس چرا

از delegate ها که برای فراخوانی چند متد استفاده می شه داره ؟


راستی این موضوع رو در نظر بگیرید:

یک کلاسی به نام person تعریف کنید که یک خصوصیت به نام name داشته باشه و یک

event برای آن تعریف کنید که هر زمان که این خصوصیت خواست تغییر کنه تغییر یا عدم

تغییر آن را از کاربر سئوال کنه. خوب رویداد مربوط به تغییر رو هم می تونیم در click یه button

قرار داد مثلا customer.name="harchi";

خوب دوستان اگه کسی می تونه در نوشتن کد این یه کمکی بکنه تا مطلب event ها و روش

کد نویسی بهینش ارائه بشه.