
1
00:00.110 --> 00:00.890
خوش برگشتید.

2
00:00.890 --> 00:03.380
خب، تو این ویدئو قراره راجع به Delegate ها صحبت کنیم.

3
00:03.380 --> 00:05.540
و حداقل شروع می‌کنیم که راجع بهشون صحبت کنیم.

4
00:05.540 --> 00:07.550
این‌ها کمی پیچیده‌ترند.

5
00:07.550 --> 00:11.660
بنابراین چیزهای خیلی بیشتری هست که باید در موردشون بدونیم، نه فقط اون چیزهایی که می‌تونیم تو یه ویدئو پوشش بدیم.

6
00:11.660 --> 00:15.410
و ما Delegate ها رو فقط کمی دیدیم، زمانی که داشتیم از Predicate ها استفاده می‌کردیم.

7
00:15.410 --> 00:18.860
و Predicate ها فقط یک بخش خیلی کوچیکی از Delegate ها هستند.

8
00:18.860 --> 00:24.560
اما تو این ویدئو، قراره عمیق‌تر وارد بحث Delegate ها بشیم، و بعدش می‌بینیم که چطور Multicast

9
00:24.560 --> 00:25.310
Delegate ها کار می‌کنند.

10
00:25.310 --> 00:27.050
و بعدش قراره Event ها رو ببینیم.

11
00:27.050 --> 00:32.280
و Delegate ها وقتی پای Event ها میاد وسط، واقعاً قدرتمند هستند، اما تو شرایط دیگه‌ای هم قدرتمندند.

12
00:32.280 --> 00:33.840
و بیاید به اون‌ها نگاه کنیم.

13
00:33.840 --> 00:35.730
خب، Delegate چی هست؟

14
00:35.760 --> 00:42.090
Delegate یک نوع (Type) هست که ارجاعاتی (References) به متدها رو با یک لیست پارامتر خاص و نوع

15
00:42.090 --> 00:42.510
بازگشتی (Return Type) مشخص، نمایش می‌ده.

16
00:42.540 --> 00:43.980
چرا باید از Delegate استفاده کنید؟

17
00:44.010 --> 00:50.400
خب، Delegate ها راهی رو فراهم می‌کنند تا بتونید متدها رو به عنوان پارامتر پاس بدید، که این، طراحی

18
00:50.400 --> 00:51.030
کد انعطاف‌پذیر و قابل گسترش رو ممکن می‌کنه.

19
00:51.030 --> 00:56.350
پس شما نمی‌تونید صرفاً مثل قبل، متغیرها رو به عنوان پارامتر پاس بدید.

20
00:56.350 --> 01:00.970
اما در واقع می‌تونید خود متدها رو هم با استفاده از Delegate ها پاس بدید.

21
01:00.970 --> 01:02.800
خب، کی باید از Delegate ها استفاده کنید؟

22
01:02.800 --> 01:09.550
شما زمانی از Delegate ها استفاده می‌کنید که نیاز دارید یک راهی برای کپسوله‌سازی (Encapsulate) یک متد

23
01:09.550 --> 01:11.020
و پاس دادن اون به عنوان آرگومان داشته باشید، همونطور که الآن دیدید، یا شنیدید؟

24
01:11.020 --> 01:12.820
و کجا باید از Delegate ها استفاده کنید؟

25
01:12.820 --> 01:16.060
خب، Delegate ها در مکانیزم‌های Callback استفاده می‌شن.

26
01:16.060 --> 01:24.950
در Event Handling و طراحی API های انعطاف‌پذیر، و API ها مخفف Application Programming Interface هستند، و این‌ها

27
01:24.950 --> 01:31.700
ارتباط ساده‌تر بین برنامه‌های مختلف رو امکان‌پذیر می‌کنند، که خیلی خیلی مفیده، چون شما نمی‌خواید

28
01:31.700 --> 01:37.730
اپلیکیشن‌تون رو کاملاً بسته و وابسته به کدنویسی تمام چیزها توسط خودتون بکنید، بلکه همچنین می‌خواید

29
01:37.760 --> 01:43.970
بتونید از اپلیکیشن‌های دیگه استفاده کنید و به طور مؤثر با اون‌ها کار کنید تا مجبور نباشید

30
01:43.970 --> 01:45.920
خودتون همه‌چیز رو بسازید.

31
01:45.920 --> 01:48.990
و این موضوع، بعدها تو این دوره خیلی خیلی مهم‌تر می‌شه.

32
01:48.990 --> 01:51.570
و قراره ببینیم چطور از API ها هم استفاده کنیم.

33
01:51.570 --> 01:52.020
بسیار خب.

34
01:52.020 --> 01:55.380
خب، حالا بیاید ببینیم چطور واقعاً از یک Delegate استفاده کنیم.

35
01:55.380 --> 01:57.780
و یکم با Predicate دیدیمش.

36
01:57.780 --> 01:59.310
اما حالا بیاید واقعاً عمیق‌تر وارد بشیم.

37
01:59.310 --> 02:02.430
خب، اول از همه چطور یک Delegate رو اعلام (Declare) می‌کنیم؟

38
02:02.430 --> 02:06.870
خب، اول از همه، واقعاً مفیده که بفهمید Delegate ها یک Method Signature رو تعریف می‌کنند.

39
02:06.870 --> 02:11.040
و هر متدی که به یک Delegate اختصاص داده می‌شه، باید با این Signature مطابقت داشته باشه.

40
02:11.040 --> 02:11.550
باشه.

41
02:11.570 --> 02:15.290
حالا بیاید با Declaration (اعلام) همچین Delegateـی شروع کنیم.

42
02:15.290 --> 02:19.280
خب، می‌خوام اونو اینجا بذارم چون در غیر این صورت نمی‌تونم درست انجامش بدم.

43
02:19.280 --> 02:23.330
پس اون رو Public می‌کنم تا بتونم از هر جایی بهش دسترسی داشته باشم.

44
02:23.330 --> 02:28.910
بعدش از این Keyword Delegate استفاده می‌کنم و بعدش کل Method Signature رو تعریف می‌کنم.

45
02:28.910 --> 02:29.150
باشه.

46
02:29.150 --> 02:34.460
خب، برای مثال، اگه بخوام متدهایی که می‌تونن به Delegate پاس داده بشن هیچی رو برنگردونن، می‌تونم از

47
02:34.460 --> 02:35.060
Void استفاده کنم.

> NESA:
48
02:35.060 --> 02:38.580
اگه می‌خواستم String برگردونه، می‌تونستم از String استفاده کنم و به همین ترتیب.

49
02:38.580 --> 02:40.230
پس، قراره ساده نگهش دارم.

50
02:40.230 --> 02:44.670
پس فقط می‌خوام بگم این یک Delegate خواهد بود که قراره بهش بگم Notify.

51
02:44.670 --> 02:47.430
و می‌بینید که اینجا از حرف بزرگ N استفاده کردم.

52
02:47.430 --> 02:51.510
و بعدش داخل پرانتزها جاییه که من تعریف می‌کنم چه پارامترهایی می‌خوام داشته باشم.

53
02:51.510 --> 02:55.560
پس فقط می‌خوام بگم می‌خوام یک Message داشته باشم، باشه؟

54
02:55.560 --> 02:58.470
خب تمومه، اینجا با یک Semicolon (نقطه‌ویرگول) تمومش می‌کنم.

55
02:58.470 --> 03:00.780
می‌بینید که برای Delegate هیچ Body (بدنه‌ای) وجود نداره.

56
03:00.780 --> 03:06.310
بنابراین، با اینکه تا اینجای کار تقریباً شبیه یک متده، وقتی Keyword "Delegate" رو اضافه می‌کنیم،

57
03:06.310 --> 03:10.600
هیچ Bodyـی وجود نداره، پس من به Delegate، Body اضافه نمی‌کنم.

58
03:10.600 --> 03:14.800
باشه، پس حالا این Delegate به نام Notify رو داریم.

59
03:14.800 --> 03:17.560
این جاییه که در مورد Declaration (اعلام) هستیم.

60
03:17.560 --> 03:21.100
خب، چطور می‌تونیم یک Delegate رو Instantiate (نمونه‌سازی) کنیم؟

61
03:21.100 --> 03:29.240
برای این کار، باید مطمئن شیم که یک متد داریم که می‌تونیم اون رو به Delegate پاس بدیم.

62
03:29.240 --> 03:31.730
خب، چندین راه برای انجام این کار وجود داره.

63
03:31.730 --> 03:33.710
فرض کنید این متد رو اینجا داریم.

64
03:33.710 --> 03:40.370
پس، Static Void و این یکی Show Message خواهد بود.

65
03:40.370 --> 03:46.640
و اون هم یک Message می‌گیره و Message رو نمایش می‌ده، باشه؟

66
03:46.640 --> 03:50.480
پس یک متد Static یا Void خیلی ساده، باشه؟

67
03:50.480 --> 03:54.090
حالا بیاید از این متد برای انجام Instantiation (نمونه‌سازی) Delegateمون استفاده کنیم.

68
03:54.090 --> 03:55.650
پس، من از Notify استفاده می‌کنم.

69
03:55.680 --> 04:01.230
بعدش به این Delegate یک اسم می‌دم، بهش می‌گم Notify Delegate.

70
04:01.230 --> 04:05.280
و بعدش می‌تونم به دو روش مختلف این کار رو انجام بدم.

71
04:05.280 --> 04:11.280
خب، یا مستقیماً Show Message رو اینجا اضافه می‌کنم.

72
04:11.280 --> 04:12.180
به این صورت.

73
04:12.180 --> 04:15.660
یا راه دیگه می‌تونه این باشه: Notify.

74
04:15.690 --> 04:21.800
Notify Delegate برابر است با New Notify و Notify Delegate.

75
04:21.800 --> 04:24.290
پس این یه راه دیگه خواهد بود.

76
04:24.290 --> 04:30.740
این روش قدیمی‌ای هست که قبل از #C 2، یعنی یه روش فوق‌العاده قدیمی، انجامش می‌دادید.

77
04:30.740 --> 04:36.200
اما هنوز معتبره و هنوز چیزیه که احتمالاً در طول مسیرتون به عنوان یک Developer خواهید دید.

78
04:36.200 --> 04:42.590
اما این یک راه راحت‌تره که توش اساساً فقط خود متد رو به Delegate پاس می‌دید.

79
04:42.590 --> 04:43.250
باشه.

80
04:43.250 --> 04:46.160
باشه، پس Instantiation (نمونه‌سازی) به این صورت کار می‌کنه.

81
04:46.160 --> 04:49.520
و بعدش چطور Invocation (فراخوانی) رو انجام می‌دیم؟

82
04:49.520 --> 04:52.100
یعنی اساساً صدا زدن Delegate.

83
04:52.130 --> 05:01.040
خب، می‌تونیم فقط از اسم Delegate استفاده کنیم و بعدش هر چی که تعریف پارامتر Delegate هست رو

84
05:01.040 --> 05:02.720
اینجا پاس بدیم.

85
05:02.720 --> 05:08.510
پس می‌بینید که Notify انتظار یک Message از نوع String رو داره و Void برمی‌گردونه.

86
05:08.510 --> 05:09.810
یعنی هیچی برنمی‌گردونه.

87
05:09.810 --> 05:16.140
پس می‌تونم بگم "Hello delegates" و شاید برای درست بودن گرامری یک کاما (ویرگول) هم اینجا اضافه کنم.

88
05:16.140 --> 05:19.470
و بعدش با یک Semicolon (نقطه‌ویرگول) تموم می‌کنیم.

89
05:19.470 --> 05:24.000
خب، این چیزی که اینجا هست، ساده‌ترین راه از بین این سه مرحله‌ است.

90
05:24.000 --> 05:28.410
یعنی Declaration (اعلام)، Instantiation (نمونه‌سازی) و Invocation (فراخوانی).

91
05:28.410 --> 05:33.780
حالا اگه این رو اجرا کنیم، می‌بینیم که فقط می‌گه "Hello delegates".

92
05:33.810 --> 05:35.150
چیز خیلی خاصی نیست.

93
05:35.150 --> 05:43.670
باشه، پس کاری که من دارم انجام می‌دم اینه که یک Delegate رو اعلام می‌کنم و اون یک Method Signature خاصی داره.

94
05:43.670 --> 05:49.730
پس این Method Signature هست: Return Type، اسمش مهم نیست اما بعدش پارامترها، باشه؟

> NESA:
95
05:49.730 --> 05:58.670
خب بعدش، اینجا دارم یک متد رو به Delegate اختصاص می‌دم که با Method Signature مطابقت داره.

96
05:58.670 --> 06:02.130
خب اینجا می‌بینید: Void، String Message.

97
06:02.250 --> 06:03.840
اسم Message مهم نیست.

98
06:03.840 --> 06:05.880
اما چیزی که مهمه، String هست.

99
06:05.880 --> 06:10.710
اینجا می‌تونیم خیلی راحت تست کنیم که آیا با وجود اینکه اسم متفاوتی داریم، باز هم کار می‌کنه یا نه.

100
06:10.710 --> 06:13.680
این همیشه چیزیه که می‌تونید بررسی کنید.

101
06:13.680 --> 06:16.440
پس می‌بینید، خود اسم‌گذاری مهم نیست.

102
06:16.440 --> 06:17.790
مهم Type هست، درسته؟

103
06:17.790 --> 06:20.580
Parameter Type و همچنین Return Type.

104
06:20.790 --> 06:21.120
باشه.

105
06:21.120 --> 06:25.200
اسم‌گذاری اون متغیرها اونقدرها مهم نیست، باشه؟

106
06:25.200 --> 06:27.160
خب، پس تقریباً همینه.

107
06:27.160 --> 06:31.180
برای اولین مرحله از Delegate ها، قراره عمیق‌تر واردش بشیم.

108
06:31.180 --> 06:33.310
اون‌ها تو بحث Event ها واقعاً مهم هستند.

109
06:33.310 --> 06:37.270
پس برای Event ها باید Multicast Delegate ها رو بفهمیم.

110
06:37.270 --> 06:43.360
اما قبل از اون، بیاید کمی بیشتر راجع به Delegate ها صحبت کنیم، چون این یک مثال خیلی ساده بود.

111
06:43.360 --> 06:46.180
می‌خوام پیچیدگی مثال رو بیشتر کنم.

112
06:46.180 --> 06:49.600
تا هنوز هم حس بهتری از چگونگی کار Delegate ها به دست بیارید.

113
06:49.600 --> 06:50.110
خیلی خب.

114
06:50.110 --> 06:51.670
پس تو ویدئوی بعدی می‌بینمتون.
