خوش برگشتید.
خب، تو این ویدئو قراره راجع به Delegate ها صحبت کنیم.
و حداقل شروع می‌کنیم که راجع بهشون صحبت کنیم.
این‌ها کمی پیچیده‌ترند.
بنابراین چیزهای خیلی بیشتری هست که باید در موردشون بدونیم، نه فقط اون چیزهایی که می‌تونیم تو یه ویدئو پوشش بدیم.
و ما Delegate ها رو فقط کمی دیدیم، زمانی که داشتیم از Predicate ها استفاده می‌کردیم.
و Predicate ها فقط یک بخش خیلی کوچیکی از Delegate ها هستند.
اما تو این ویدئو، قراره عمیق‌تر وارد بحث Delegate ها بشیم، و بعدش می‌بینیم که چطور Multicast
Delegate ها کار می‌کنند.
و بعدش قراره Event ها رو ببینیم.
و Delegate ها وقتی پای Event ها میاد وسط، واقعاً قدرتمند هستند، اما تو شرایط دیگه‌ای هم قدرتمندند.
و بیاید به اون‌ها نگاه کنیم.
خب، Delegate چی هست؟
Delegate یک نوع (Type) هست که ارجاعاتی (References) به متدها رو با یک لیست پارامتر خاص و نوع
بازگشتی (Return Type) مشخص، نمایش می‌ده.
چرا باید از Delegate استفاده کنید؟
خب، Delegate ها راهی رو فراهم می‌کنند تا بتونید متدها رو به عنوان پارامتر پاس بدید، که این، طراحی
کد انعطاف‌پذیر و قابل گسترش رو ممکن می‌کنه.
پس شما نمی‌تونید صرفاً مثل قبل، متغیرها رو به عنوان پارامتر پاس بدید.
اما در واقع می‌تونید خود متدها رو هم با استفاده از Delegate ها پاس بدید.
خب، کی باید از Delegate ها استفاده کنید؟
شما زمانی از Delegate ها استفاده می‌کنید که نیاز دارید یک راهی برای کپسوله‌سازی (Encapsulate) یک متد
و پاس دادن اون به عنوان آرگومان داشته باشید، همونطور که الآن دیدید، یا شنیدید؟
و کجا باید از Delegate ها استفاده کنید؟
خب، Delegate ها در مکانیزم‌های Callback استفاده می‌شن.
در Event Handling و طراحی API های انعطاف‌پذیر، و API ها مخفف Application Programming Interface هستند، و این‌ها
ارتباط ساده‌تر بین برنامه‌های مختلف رو امکان‌پذیر می‌کنند، که خیلی خیلی مفیده، چون شما نمی‌خواید
اپلیکیشن‌تون رو کاملاً بسته و وابسته به کدنویسی تمام چیزها توسط خودتون بکنید، بلکه همچنین می‌خواید
بتونید از اپلیکیشن‌های دیگه استفاده کنید و به طور مؤثر با اون‌ها کار کنید تا مجبور نباشید
خودتون همه‌چیز رو بسازید.
و این موضوع، بعدها تو این دوره خیلی خیلی مهم‌تر می‌شه.
و قراره ببینیم چطور از API ها هم استفاده کنیم.
بسیار خب.
خب، حالا بیاید ببینیم چطور واقعاً از یک Delegate استفاده کنیم.
و یکم با Predicate دیدیمش.
اما حالا بیاید واقعاً عمیق‌تر وارد بشیم.
خب، اول از همه چطور یک Delegate رو اعلام (Declare) می‌کنیم؟
خب، اول از همه، واقعاً مفیده که بفهمید Delegate ها یک Method Signature رو تعریف می‌کنند.
و هر متدی که به یک Delegate اختصاص داده می‌شه، باید با این Signature مطابقت داشته باشه.
باشه.
حالا بیاید با Declaration (اعلام) همچین Delegateـی شروع کنیم.
خب، می‌خوام اونو اینجا بذارم چون در غیر این صورت نمی‌تونم درست انجامش بدم.
پس اون رو Public می‌کنم تا بتونم از هر جایی بهش دسترسی داشته باشم.
بعدش از این Keyword Delegate استفاده می‌کنم و بعدش کل Method Signature رو تعریف می‌کنم.
باشه.
خب، برای مثال، اگه بخوام متدهایی که می‌تونن به Delegate پاس داده بشن هیچی رو برنگردونن، می‌تونم از
Void استفاده کنم. > NESA:
اگه می‌خواستم String برگردونه، می‌تونستم از String استفاده کنم و به همین ترتیب.
پس، قراره ساده نگهش دارم.
پس فقط می‌خوام بگم این یک Delegate خواهد بود که قراره بهش بگم Notify.
و می‌بینید که اینجا از حرف بزرگ N استفاده کردم.
و بعدش داخل پرانتزها جاییه که من تعریف می‌کنم چه پارامترهایی می‌خوام داشته باشم.
پس فقط می‌خوام بگم می‌خوام یک Message داشته باشم، باشه؟
خب تمومه، اینجا با یک Semicolon (نقطه‌ویرگول) تمومش می‌کنم.
می‌بینید که برای Delegate هیچ Body (بدنه‌ای) وجود نداره.
بنابراین، با اینکه تا اینجای کار تقریباً شبیه یک متده، وقتی Keyword "Delegate" رو اضافه می‌کنیم،
هیچ Bodyـی وجود نداره، پس من به Delegate، Body اضافه نمی‌کنم.
باشه، پس حالا این Delegate به نام Notify رو داریم.
این جاییه که در مورد Declaration (اعلام) هستیم.
خب، چطور می‌تونیم یک Delegate رو Instantiate (نمونه‌سازی) کنیم؟
برای این کار، باید مطمئن شیم که یک متد داریم که می‌تونیم اون رو به Delegate پاس بدیم.
خب، چندین راه برای انجام این کار وجود داره.
فرض کنید این متد رو اینجا داریم.
پس، Static Void و این یکی Show Message خواهد بود.
و اون هم یک Message می‌گیره و Message رو نمایش می‌ده، باشه؟
پس یک متد Static یا Void خیلی ساده، باشه؟
حالا بیاید از این متد برای انجام Instantiation (نمونه‌سازی) Delegateمون استفاده کنیم.
پس، من از Notify استفاده می‌کنم.
بعدش به این Delegate یک اسم می‌دم، بهش می‌گم Notify Delegate.
و بعدش می‌تونم به دو روش مختلف این کار رو انجام بدم.
خب، یا مستقیماً Show Message رو اینجا اضافه می‌کنم.
به این صورت.
یا راه دیگه می‌تونه این باشه: Notify.
Notify Delegate برابر است با New Notify و Notify Delegate.
پس این یه راه دیگه خواهد بود.
این روش قدیمی‌ای هست که قبل از #C 2، یعنی یه روش فوق‌العاده قدیمی، انجامش می‌دادید.
اما هنوز معتبره و هنوز چیزیه که احتمالاً در طول مسیرتون به عنوان یک Developer خواهید دید.
اما این یک راه راحت‌تره که توش اساساً فقط خود متد رو به Delegate پاس می‌دید.
باشه.
باشه، پس Instantiation (نمونه‌سازی) به این صورت کار می‌کنه.
و بعدش چطور Invocation (فراخوانی) رو انجام می‌دیم؟
یعنی اساساً صدا زدن Delegate.
خب، می‌تونیم فقط از اسم Delegate استفاده کنیم و بعدش هر چی که تعریف پارامتر Delegate هست رو
اینجا پاس بدیم.
پس می‌بینید که Notify انتظار یک Message از نوع String رو داره و Void برمی‌گردونه.
یعنی هیچی برنمی‌گردونه.
پس می‌تونم بگم "Hello delegates" و شاید برای درست بودن گرامری یک کاما (ویرگول) هم اینجا اضافه کنم.
و بعدش با یک Semicolon (نقطه‌ویرگول) تموم می‌کنیم.
خب، این چیزی که اینجا هست، ساده‌ترین راه از بین این سه مرحله‌ است.
یعنی Declaration (اعلام)، Instantiation (نمونه‌سازی) و Invocation (فراخوانی).
حالا اگه این رو اجرا کنیم، می‌بینیم که فقط می‌گه "Hello delegates".
چیز خیلی خاصی نیست.
باشه، پس کاری که من دارم انجام می‌دم اینه که یک Delegate رو اعلام می‌کنم و اون یک Method Signature خاصی داره.
پس این Method Signature هست: Return Type، اسمش مهم نیست اما بعدش پارامترها، باشه؟ > NESA:
خب بعدش، اینجا دارم یک متد رو به Delegate اختصاص می‌دم که با Method Signature مطابقت داره.
خب اینجا می‌بینید: Void، String Message.
اسم Message مهم نیست.
اما چیزی که مهمه، String هست.
اینجا می‌تونیم خیلی راحت تست کنیم که آیا با وجود اینکه اسم متفاوتی داریم، باز هم کار می‌کنه یا نه.
این همیشه چیزیه که می‌تونید بررسی کنید.
پس می‌بینید، خود اسم‌گذاری مهم نیست.
مهم Type هست، درسته؟
Parameter Type و همچنین Return Type.
باشه.
اسم‌گذاری اون متغیرها اونقدرها مهم نیست، باشه؟
خب، پس تقریباً همینه.
برای اولین مرحله از Delegate ها، قراره عمیق‌تر واردش بشیم.
اون‌ها تو بحث Event ها واقعاً مهم هستند.
پس برای Event ها باید Multicast Delegate ها رو بفهمیم.
اما قبل از اون، بیاید کمی بیشتر راجع به Delegate ها صحبت کنیم، چون این یک مثال خیلی ساده بود.
می‌خوام پیچیدگی مثال رو بیشتر کنم.
تا هنوز هم حس بهتری از چگونگی کار Delegate ها به دست بیارید.
خیلی خب.
پس تو ویدئوی بعدی می‌بینمتون.