WEBVTT

00:00.140 --> 00:00.830
خوش اومدی دوباره.

00:00.830 --> 00:06.230
توی این ویدیو قراره بریم سراغ polymorphism و بخش دیگه‌ای ازش رو یاد بگیریم که تا حالا نگفتیم.

00:06.230 --> 00:07.640
یه بخشش رو قبلاً یاد گرفتیم.

00:07.640 --> 00:15.530
اون بخش مربوط به کلیدواژه‌های override و virtual بود، که باعث می‌شن کلاس‌های مشتق‌شده بتونن متدی رو که تو کلاس پایه تعریف شده، بازنویسی کنن.

00:15.530 --> 00:23.390
اما یه جنبه‌ی دیگه از polymorphism هم وجود داره که توی این ویدیو قراره بهش بپردازیم.

00:23.390 --> 00:28.460
من اینجا دارم از کلاس‌ها استفاده می‌کنم.

00:28.460 --> 00:31.040
فعلاً از interface استفاده نمی‌کنم.

00:31.040 --> 00:33.380
اما بعدش دوباره با interface کار می‌کنیم تا مسیر جایگزینش رو هم نشون بدم.

00:33.380 --> 00:39.410
خب، اینجا یه کلاس public به اسم animal داریم با یه متد virtual void به اسم MakeSound.

00:39.410 --> 00:40.010
اوکی؟

00:40.010 --> 00:45.770
پس این متدی‌ه که کلاس animal داره، ولی ما اجازه داریم اونو override کنیم.

00:45.770 --> 00:50.990
به همین دلیله که از کلیدواژه‌ی virtual استفاده کردیم.

00:50.990 --> 01:02.870
بعد یه کلاس dog داریم که از animal ارث‌بری کرده و داره متد MakeSound اون رو override می‌کنه و پیاده‌سازی خودش رو می‌نویسه.

01:02.870 --> 01:06.890
یعنی توی پیاده‌سازی خودش می‌گه Console.WriteLine("bark").

01:06.890 --> 01:11.690
پس سگ پارس می‌کنه و animal یه صدای کلی از یه حیوان درمیاره.

01:11.690 --> 01:13.790
بعد یه کلاس cat هم داریم.

01:13.790 --> 01:18.140
گربه هم پیاده‌سازی خودش از MakeSound رو داره.

01:18.140 --> 01:23.870
و پیاده‌سازی cat هم می‌گه meow، چون cat هم از animal ارث‌بری کرده.

01:23.870 --> 01:25.610
پس اینجا از interface استفاده نکردیم، درسته؟

01:25.610 --> 01:27.500
فقط از کلاس‌های معمولی استفاده کردیم.

01:27.500 --> 01:33.770
یعنی animal یه کلاس معمولیه و خودش هم مشخص می‌کنه که متد MakeSound چی کار کنه.

01:33.770 --> 01:39.320
حالا می‌رسیم به جنبه‌ی دوم polymorphism.

01:39.320 --> 01:45.140
قبلاً گفتیم بخش اولش این بود که ما متد کلاس پایه رو توی کلاس فرزند override می‌کنیم.

01:45.140 --> 01:48.500
یعنی کلاس والد یه متد داره و ما اون رو توی فرزند بازنویسی می‌کنیم.

01:48.500 --> 01:54.230
اما حالا می‌خوایم بریم سراغ بخش دوم polymorphism.

01:54.230 --> 01:59.930
که توش یه dog رو مثل animal در نظر می‌گیریم و یه cat رو هم مثل animal.

01:59.930 --> 02:05.930
یعنی حتی اگه یه dog، یه سگ باشه، باز هم یه animal حساب می‌شه.

02:05.930 --> 02:08.840
بذار نشونت بدم منظورم چیه.

02:08.840 --> 02:10.640
فرض کن داریم اینو می‌نویسیم:

02:10.640 --> 02:16.340
animal myDog = new dog();

02:16.340 --> 02:18.680
اینجا دقیقاً چی داره اتفاق می‌افته؟

02:18.770 --> 02:19.760
موضوع اینه که...

02:19.760 --> 02:25.460
اینجا وارد بخش دوم polymorphism شدیم، درسته؟

02:25.460 --> 02:26.900
کلمه‌ی polymorphism ریشه‌ی یونانی داره.

02:26.900 --> 02:29.180
هر وقت poly دیدی، بدون از یونانی اومده.

02:29.180 --> 02:36.590
و هر وقت توی یه کلمه دوتا f رو با صدای "ف" تلفظ می‌کنی، بدون اونم احتمالاً ریشه‌ی یونانی داره!

02:36.590 --> 02:41.900
خب، تو polymorphism داریم یه متغیر از نوع animal می‌سازیم،

02:41.900 --> 02:46.250
ولی در واقع یه شیء از نوع dog توش ذخیره می‌کنیم.

02:46.250 --> 02:47.630
پس چی داره می‌شه؟

02:47.630 --> 02:55.670
موضوع اینه که dog از animal ارث‌بری کرده، یعنی همه‌ی ویژگی‌ها و رفتارهای animal رو داره.

02:55.670 --> 03:00.170
پس می‌تونیم ازش به‌جای animal استفاده کنیم، ولی برعکسش ممکن نیست.

03:00.170 --> 03:02.750
یعنی نمی‌تونیم بنویسیم:

03:02.750 --> 03:06.530
dog mySecondDog = new animal();

03:06.530 --> 03:08.270
چنین چیزی جواب نمی‌ده.

03:08.270 --> 03:10.940
فقط برعکسش کار می‌کنه.

03:10.940 --> 03:16.580
و اگه اینو امتحان کنیم، خطا می‌گیریم که می‌گه:

03:16.580 --> 03:16.910
نمی‌تونه نوع interface app animal رو به interface app dog تبدیل کنه و شاید یه cast لازم داری.

03:16.910 --> 03:17.870
آیا یه cast رو از قلم انداختی؟

03:17.870 --> 03:21.860
می‌تونستیم cast کنیم، ولی الان نمی‌خوایم وارد اون موضوع بشیم.

03:21.860 --> 03:30.140
فقط می‌خوام نشون بدم هر وقت یه کلاس از یه کلاس دیگه ارث‌بری کنه، می‌تونیم مثل این ازش استفاده کنیم.

03:30.140 --> 03:30.950
مثل همین مثال بالا.

03:30.950 --> 03:33.200
خب حالا چی کار می‌تونیم بکنیم؟

03:33.200 --> 03:36.230
می‌تونیم صدای سگ رو پخش کنیم.

03:36.230 --> 03:38.630
ببینیم چی درمیاد.

03:38.630 --> 03:41.810
می‌بینیم که پارس می‌کنه.

03:41.810 --> 03:44.240
پس چرا animal داره پارس می‌کنه؟

03:44.240 --> 03:46.670
چون در واقع animal ما یه dog هست.

03:46.700 --> 03:47.420
درسته.

03:47.420 --> 03:53.600
پس به این روش، فرقی نمی‌کنه اسم متغیر رو چی بذاریم؛ می‌تونستیم اسمش رو myCat یا هرچی بذاریم.

03:53.600 --> 03:55.820
اسمش مهم نیست.

03:55.880 --> 03:57.500
اون چیزی که مهمه اینه که اینجا چی ساختیم.

03:57.500 --> 03:58.580
اینجا new dog ساختیم.

03:58.580 --> 04:00.320
اون مهمه.

04:00.320 --> 04:03.320
و صداش چی درمیاد؟

04:03.320 --> 04:05.540
صدای dog درمیاد، نه صدای animal.

04:05.540 --> 04:10.310
و این یه مثال ساده از polymorphism بود.

04:10.310 --> 04:14.360
خب، همین دیگه برای این ویدیو کافیه.

04:14.720 --> 04:16.610
تو ویدیوی بعدی می‌بینمت.

04:16.610 --> 04:19.340
اونجا قراره چندتا مفهوم رو با هم ترکیب کنیم.

04:19.340 --> 04:22.910
قراره polymorphism رو با interfaceها ترکیب کنیم.
