خوش اومدی دوباره.
توی این ویدیو قراره بریم سراغ polymorphism و بخش دیگه‌ای ازش رو یاد بگیریم که تا حالا نگفتیم.
یه بخشش رو قبلاً یاد گرفتیم.
اون بخش مربوط به کلیدواژه‌های override و virtual بود، که باعث می‌شن کلاس‌های مشتق‌شده بتونن متدی رو که تو کلاس پایه تعریف شده، بازنویسی کنن.
اما یه جنبه‌ی دیگه از polymorphism هم وجود داره که توی این ویدیو قراره بهش بپردازیم.
من اینجا دارم از کلاس‌ها استفاده می‌کنم.
فعلاً از interface استفاده نمی‌کنم.
اما بعدش دوباره با interface کار می‌کنیم تا مسیر جایگزینش رو هم نشون بدم.
خب، اینجا یه کلاس public به اسم animal داریم با یه متد virtual void به اسم MakeSound.
اوکی؟
پس این متدی‌ه که کلاس animal داره، ولی ما اجازه داریم اونو override کنیم.
به همین دلیله که از کلیدواژه‌ی virtual استفاده کردیم.
بعد یه کلاس dog داریم که از animal ارث‌بری کرده و داره متد MakeSound اون رو override می‌کنه و پیاده‌سازی خودش رو می‌نویسه.
یعنی توی پیاده‌سازی خودش می‌گه Console.WriteLine("bark").
پس سگ پارس می‌کنه و animal یه صدای کلی از یه حیوان درمیاره.
بعد یه کلاس cat هم داریم.
گربه هم پیاده‌سازی خودش از MakeSound رو داره.
و پیاده‌سازی cat هم می‌گه meow، چون cat هم از animal ارث‌بری کرده.
پس اینجا از interface استفاده نکردیم، درسته؟
فقط از کلاس‌های معمولی استفاده کردیم.
یعنی animal یه کلاس معمولیه و خودش هم مشخص می‌کنه که متد MakeSound چی کار کنه.
حالا می‌رسیم به جنبه‌ی دوم polymorphism.
قبلاً گفتیم بخش اولش این بود که ما متد کلاس پایه رو توی کلاس فرزند override می‌کنیم.
یعنی کلاس والد یه متد داره و ما اون رو توی فرزند بازنویسی می‌کنیم.
اما حالا می‌خوایم بریم سراغ بخش دوم polymorphism.
که توش یه dog رو مثل animal در نظر می‌گیریم و یه cat رو هم مثل animal.
یعنی حتی اگه یه dog، یه سگ باشه، باز هم یه animal حساب می‌شه.
بذار نشونت بدم منظورم چیه.
فرض کن داریم اینو می‌نویسیم:
animal myDog = new dog();
اینجا دقیقاً چی داره اتفاق می‌افته؟
موضوع اینه که...
اینجا وارد بخش دوم polymorphism شدیم، درسته؟
کلمه‌ی polymorphism ریشه‌ی یونانی داره.
هر وقت poly دیدی، بدون از یونانی اومده.
و هر وقت توی یه کلمه دوتا f رو با صدای "ف" تلفظ می‌کنی، بدون اونم احتمالاً ریشه‌ی یونانی داره!
خب، تو polymorphism داریم یه متغیر از نوع animal می‌سازیم،
ولی در واقع یه شیء از نوع dog توش ذخیره می‌کنیم.
پس چی داره می‌شه؟
موضوع اینه که dog از animal ارث‌بری کرده، یعنی همه‌ی ویژگی‌ها و رفتارهای animal رو داره.
پس می‌تونیم ازش به‌جای animal استفاده کنیم، ولی برعکسش ممکن نیست.
یعنی نمی‌تونیم بنویسیم:
dog mySecondDog = new animal();
چنین چیزی جواب نمی‌ده.
فقط برعکسش کار می‌کنه.
و اگه اینو امتحان کنیم، خطا می‌گیریم که می‌گه:
نمی‌تونه نوع interface app animal رو به interface app dog تبدیل کنه و شاید یه cast لازم داری.
آیا یه cast رو از قلم انداختی؟
می‌تونستیم cast کنیم، ولی الان نمی‌خوایم وارد اون موضوع بشیم.
فقط می‌خوام نشون بدم هر وقت یه کلاس از یه کلاس دیگه ارث‌بری کنه، می‌تونیم مثل این ازش استفاده کنیم.
مثل همین مثال بالا.
خب حالا چی کار می‌تونیم بکنیم؟
می‌تونیم صدای سگ رو پخش کنیم.
ببینیم چی درمیاد.
می‌بینیم که پارس می‌کنه.
پس چرا animal داره پارس می‌کنه؟
چون در واقع animal ما یه dog هست.
درسته.
پس به این روش، فرقی نمی‌کنه اسم متغیر رو چی بذاریم؛ می‌تونستیم اسمش رو myCat یا هرچی بذاریم.
اسمش مهم نیست.
اون چیزی که مهمه اینه که اینجا چی ساختیم.
اینجا new dog ساختیم.
اون مهمه.
و صداش چی درمیاد؟
صدای dog درمیاد، نه صدای animal.
و این یه مثال ساده از polymorphism بود.
خب، همین دیگه برای این ویدیو کافیه.
تو ویدیوی بعدی می‌بینمت.
اونجا قراره چندتا مفهوم رو با هم ترکیب کنیم.
قراره polymorphism رو با interfaceها ترکیب کنیم.