خوش برگشتید.
خب، بیاید یه مثال دیگه از **delegate** رو بررسی کنیم تا یکم بیشتر درکش کنید، قبل از اینکه بریم سراغ
**generics** و بعد ببینیم چطور یک الگوریتم **sorting** بنویسیم، که یک ویدیوی نسبتاً
چالشی، اما خیلی مفیده.
پس من یک **public delegate** ایجاد می‌کنم که **log handler** خواهد بود و فقط یک پیام **string** رو دریافت می‌کنه.
خیلی ساده.
چیز خیلی ساده‌ای.
بعد اینجا یک **class** خواهم داشت که اسمش **logger** هست.
باشه؟
خب، این **class** قراره کار **logging** رو انجام بده.
و چیزی که قراره داشته باشه، دو تا **method** هست.
پس یکی به **console** با اون پیام **log** می‌کنه.
و ما فقط می‌گیم: **console dot log** یا دو نقطه یا **console log**.
شاید اینطوری بهتر باشه.
و بعد پیام هرچی که هست. اوکی؟
پس تا اینجای کار، چیز خیلی عجیبی نداریم.
و بعد فرض کنیم یه **method** دیگه اینجا داریم: **public void log to** مثلاً **file**. اوکی؟
پس اینجا هم اون پیام رو می‌گیرم: **string message**.
و می‌خوام شبیه‌سازی کنم که دارم توی **file**، **logging** می‌کنم.
پس می‌گم: **file log** و بعد دو نقطه و بعد هرچی که پیام هست. اوکی؟
خب، هدف اینجا واقعاً فقط توضیح نحوه‌ی کار **delegate** هاست.
نه خیلی در مورد مفهوم **logging to file** و این جور چیزا.
قبلاً دیدیم که **logging to a file** چطوری کار می‌کنه، اما اینجا می‌خوام ساده نگه‌ش دارم.
پس این **public delegate void log handler** رو داریم.
و این **log handler** هیچی برنمی‌گردونه، اما یک **string** نیاز داره.
پس اگه می‌خوایم از **log handler** استفاده کنیم، باید مطمئن بشیم **method**ی که بهش اختصاص می‌دیم، از همون
**declaration** پیروی می‌کنه.
همین **declaration** رو برای **log to console** و همچنین **log to file** داریم.
اوکی، پس بیاید از اونا توی **main menu** استفاده کنیم.
توی **main method** یک **logger** خواهم داشت که یک **new logger** خواهد بود.
و یک **log handler** خواهم داشت.
پس **log handler** که **my log handler** من خواهد بود و من **log to console** رو بهش اختصاص می‌دم.
و این جزئی از **logger** خواهد بود. اوکی؟
**Logger** و **log to console**.
اوکی.
پس این **delegate** منه، این **log handler**.
و می‌بینید که می‌تونم **method** رو بدون پرانتز بهش اختصاص بدم.
درسته؟
دارم **method** رو **call** نمی‌کنم.
دارم **method** رو اختصاص می‌دم.
و بعد می‌تونم برم جلو و از اون **log handler** استفاده کنم.
پس حالا می‌تونم از این **delegate** استفاده کنم و مثلاً فقط بگم: **logging to console**.
حالا می‌گه: **console log logging to console** یا هرچی.
مشکلی نیست.
پس حالا اینو اجرا می‌کنیم و می‌بینیم چطور کار می‌کنه.
و می‌بینید: **console log log into console**. اوکی؟
حالا می‌تونیم **log handler**مون رو با یک **method** دیگه بازنویسی (override) کنیم.
پس **logger** به **log to file**.
پس حالا فقط می‌گیم: خب، یه **method** دیگه هست که اونم از همین **declaration** پیروی می‌کنه.
من فقط اونو می‌فرستم.
و می‌تونم دوباره از **log handler** استفاده کنم و یه چیزی رو **log** کنم.
مثلاً: **log some some stuff**.
اوکی.
پس این چیزها روی یک **file**، **log** می‌شن.
حداقل این هدف ماست، درسته؟
پس دوباره اجراش می‌کنیم و قسمت اول رو می‌بینیم.
توی **console**، **log** می‌کنه.
و قسمت دوم توی **file**، **log** می‌کنه.
پس می‌بینید که از کجا میاد.
که توی **file**، **log** می‌کنه.
خب معلومه که این می‌تونه تمام **logic**ای باشه که می‌خوایم استفاده کنیم.
و این می‌تونه یه **logic** کاملاً جدید باشه که می‌خوایم استفاده کنیم.
پس می‌بینید که یکم شباهت‌هایی به چیزی داره که موقع استفاده از **interface**ها دیدیم.
اما واقعاً اون نیست، درسته؟
یه چیز دیگه است.
در واقع ما یک **method** داریم که یک **declaration** خاص داره و می‌تونیم ازش استفاده کنیم تا **method**های دیگه رو
با هر **implementation** واقعی که می‌خوایم بهش اختصاص بدیم، و این حتی جالب‌تر و مرتبط‌تر می‌شه،
و تفاوت با **interface**ها حتی واضح‌تر و قابل درک‌تر می‌شه وقتی از **multicast delegate**ها استفاده کنیم،
که به ما اجازه می‌ده چندین **method** رو به یک **delegate** اختصاص بدیم.
اوکی، پس این یک مثال خیلی ساده از نحوه‌ی استفاده از **delegate**ها بود.
حالا بریم سراغ ویدیوی بعدی.