WEBVTT

00:00.140 --> 00:00.950
دوباره خوش اومدی.

00:00.950 --> 00:06.500
توی این ویدیو می‌خوام مطمئن شم که واقعاً تفاوت بین reference type و value type رو درک می‌کنی، باشه؟

00:06.500 --> 00:08.690
همونطور که قبلاً گفتم، structها value type هستن.

00:08.690 --> 00:12.110
اون‌ها reference type نیستن.

00:12.110 --> 00:13.430
classها اما reference type هستن.

00:13.430 --> 00:15.230
خب حالا تفاوتشون چیه؟

00:15.230 --> 00:17.180
بریم ببینیم.

00:17.180 --> 00:18.200
اینجا چی داریم.

00:18.200 --> 00:25.400
یه struct به اسم point داریم با مقدارهای x و y و یه constructor که همین دو تا رو مقداردهی می‌کنه

00:25.400 --> 00:28.820
و یه متد display که فقط این دو مقدار رو نشون می‌ده.

00:28.820 --> 00:37.110
و بعد یه ساختار مشابه هم برای class نوشتم، چون تفاوت اصلی اینه که classها، همونطور که گفتم،

00:37.110 --> 00:39.570
قابل ارث‌بری هستن ولی structها نه.

00:39.570 --> 00:42.360
و همونطور که گفتم، یکی value type هست و اون یکی نه.

00:42.360 --> 00:44.790
پس اینا مهم‌ترین تفاوت‌ها هستن.

00:44.790 --> 00:49.230
و این class هم دقیقاً مثل struct یه X و Y داره.

00:49.230 --> 00:53.450
و مقدارها رو تنظیم می‌کنه و بعد نشونشون می‌ده. خب.

00:53.450 --> 00:55.550
تا اینجا کاملاً شبیه‌ان.

00:55.550 --> 00:57.710
حالا تفاوتشون چطوری مشخص می‌شه.

00:57.710 --> 01:04.100
اینجا یه point1 دارم با مقدار 10 و 20، نشونش می‌دم. بعد یه point2 دارم که برابر point1 هست.

01:04.100 --> 01:04.700
یعنی point1 رو بهش انتساب دادم.

01:04.700 --> 01:06.560
پس p2 الان یه کپی از p1ه.

01:06.560 --> 01:10.550
بعد p2 رو نشون می‌دم و بعد مقدار x مربوط به p2 رو تغییر می‌دم.

01:10.550 --> 01:15.920
یعنی x مربوط به p2 رو می‌ذارم 25.

01:15.920 --> 01:19.100
پس دیگه 20 نیست، شده 25.

01:19.100 --> 01:21.200
اما این تغییر فقط روی p2 تأثیر می‌ذاره، نه p1.

01:21.200 --> 01:22.730
p1 همون 10 و 20 باقی می‌مونه.

01:22.730 --> 01:26.870
پس بذار اول بخش دوم رو comment کنم تا دقیق ببینیم چی می‌شه.

01:26.870 --> 01:33.020
بعد از اون هر دو تا point رو نشون می‌دم.

01:33.020 --> 01:36.620
می‌بینی که point1 هست 10 و 20 و point2 هم 10 و 20ه. اما وقتی مقدار x در p2 رو به 25 تغییر می‌دم،

01:36.620 --> 01:46.640
point1 هنوز 10 و 20ه ولی point2 شده 25 و 20.

01:46.640 --> 01:49.190
خب تا اینجا همه چی منطقیه.

01:49.220 --> 01:53.030
هیچ چیز عجیبی نیست، فقط می‌بینیم که داریم مقدار p1 رو کپی می‌کنیم داخل p2.

01:53.030 --> 01:59.270
یعنی خود مقدارش رو، نه reference به اون مقدار رو.

01:59.270 --> 02:04.640
خب حالا comment رو برمی‌دارم و اجراش می‌کنم تا تفاوت رو ببینی.

02:04.640 --> 02:10.260
اینجا سراغ کلاس‌ها می‌ریم. یه object می‌سازم از کلاس Point به اسم pc1، با مقدارهای 1 و 2.

02:10.260 --> 02:17.850
یعنی تقریباً همون point قبلیه ولی به صورت class.

02:17.850 --> 02:18.900
بعد یه object دیگه می‌سازم.

02:18.900 --> 02:20.550
اسمش رو می‌ذارم pc2.

02:20.580 --> 02:23.160
و مقدارش رو برابر با pc1 قرار می‌دم.

02:23.160 --> 02:29.760
یعنی اینجا pc2 درواقع یه reference به همون objectیه که pc1 بهش اشاره می‌کنه.

02:29.780 --> 02:35.630
یعنی هر دو به یه آدرس حافظه اشاره دارن.

02:35.630 --> 02:46.640
پس هر دو دارن به یه object تو حافظه سیستم اشاره می‌کنن، نه دو تا مختلف.

02:46.640 --> 02:50.570
در نتیجه مقادیر یکی هستن چون مکانشون تو حافظه یکیه.

02:50.570 --> 02:55.100
اما مستقل نیستن، یعنی تغییر یکی روی اون یکی هم تأثیر می‌ذاره.

02:55.100 --> 02:57.470
خب حالا هر دو رو چاپ می‌کنم.

02:57.470 --> 02:59.300
بعد مثل قبل مقدار x مربوط به pc2 رو عوض می‌کنم.

02:59.330 --> 03:04.370
این بار می‌ذارمش 3.

03:04.370 --> 03:06.170
این باعث می‌شه مقدار x در pc1 هم تغییر کنه

03:06.170 --> 03:15.980
چون هر دو به یه object اشاره دارن و هر تغییری روی یکی، توی اون یکی هم منعکس می‌شه.

03:15.980 --> 03:20.670
بعد از اینکه مقدار x رو تغییر دادم، دوباره هر دو رو چاپ می‌کنم.

03:20.670 --> 03:26.820
و وقتی اجرا می‌کنی، می‌بینی که حتی با اینکه فقط pc2 رو تغییر دادیم،

03:26.820 --> 03:32.250
مقدار x در pc1 هم تغییر کرده.

03:32.250 --> 03:40.980
و این دقیقاً همون چیزیه که می‌خواستم بگم، یعنی یکی value type و اون یکی reference typeه.

03:40.980 --> 03:45.880
کلاس‌ها reference type هستن، یعنی به یه object توی حافظه اشاره می‌کنن.

03:45.880 --> 03:46.420
اما structها نه.

03:46.420 --> 03:53.500
structها فقط خودشون یه مقدار دارن.

03:53.500 --> 03:56.080
می‌گن خب من این مقدارو دارم، اگه خواستی یه کپی ازش بگیر.

03:56.080 --> 03:56.860
و تمام.

03:56.860 --> 03:58.870
یعنی به reference اشاره نمی‌کنن.

03:58.870 --> 04:01.390
فقط همون مقدار رو منتقل می‌کنن.

04:01.390 --> 04:04.180
به همین خاطر نمی‌تونی دوتا struct رو راحت با هم مقایسه کنی،

04:04.180 --> 04:13.240
چون فقط می‌تونی بگی آیا مقدارشون یکیه یا نه، نه اینکه آیا خودشون یه object هستن یا نه.

04:13.240 --> 04:14.350
اما برای classها می‌تونی این کارو بکنی.

04:14.380 --> 04:19.480
می‌تونی بگی آیا دو تا object یکی هستن یا نه.

04:19.480 --> 04:24.580
یه متد داریم به اسم equals که هر objectی اون رو داره.

04:24.580 --> 04:28.750
چون همه‌ی classها از object ارث‌بری می‌کنن.

04:28.750 --> 04:29.230
درسته؟

04:29.230 --> 04:33.050
پس می‌تونی بنویسی pc1.equals(pc2) و این یه مقدار bool برمی‌گردونه.

04:33.050 --> 04:41.960
یعنی مثلاً یه متغیر می‌سازی به اسم isEqual.

04:41.960 --> 04:44.990
و بعد نشونش می‌دی روی صفحه.

04:44.990 --> 04:50.420
می‌نویسی "is equal:" به علاوه مقدارش.

04:50.600 --> 04:51.710
خب.

04:51.710 --> 04:54.290
حالا اجراش می‌کنیم.

04:54.290 --> 04:55.410
و باید ببینیم که مقدار true می‌ده.

04:55.410 --> 04:57.660
یعنی اون دوتا object واقعاً یکی هستن.

04:57.660 --> 05:00.120
می‌نویسه "is equal true".

05:00.120 --> 05:07.170
یعنی نشون می‌ده که با وجود اینکه اسم‌هاشون فرق داره، درونشون یکی‌ان.

05:07.170 --> 05:07.830
pc1 و pc2 هر دو دارن

05:07.830 --> 05:14.880
به یه object اشاره می‌کنن که توی حافظه قرار داره.

05:14.880 --> 05:15.930
خب فکر کنم دیگه کاملاً متوجه شدی.

05:15.930 --> 05:17.040
همین بود کل مطلب.

05:17.040 --> 05:18.660
اینم از این ویدیو.

05:18.660 --> 05:19.560
توی ویدیو بعدی می‌بینمت.
