باشه.
تو این ویدیو قراره کلمه‌ی کلیدی **base** رو بررسی کنیم.
این در واقع یه راه‌حل برای یه مشکله. پس بیایید اول خود مشکل رو ببینیم.
فرض کن دارم یه شیء از کلاس **Dog** می‌سازم و می‌خوام به متد **MakeSound** از کلاس پایه یعنی **Animal** دسترسی پیدا کنم.
اون متدی که صدای عمومی حیوان رو تولید می‌کنه.
اما خب این خیلی کلیه، درسته؟
خیلی ساده‌ست.
فقط یه دستور `Console.WriteLine` داره.
ولی معمولاً تو واقعیت این متدها اینقدر ساده و بی‌خاصیت نیستن.
مثلاً...
ممکنه کلی مقداردهی اولیه انجام بدن،
یه سری ویژگی‌ها (properties) رو تنظیم کنن، مقدارها رو ست کنن و آماده‌سازی انجام بدن.
و ما باید مطمئن بشیم که هر کلاس مشتق‌شده‌ای که داریم، وقتی اون متد رو صدا می‌زنه، باعث اختلال نشه.
چون ممکنه بعضی ویژگی‌ها هنوز مقدار نگرفته باشن یا یه چیزی جا مونده باشه.
اینجاست که می‌تونیم از کلمه‌ی کلیدی **base** داخل کلاس **Dog** استفاده کنیم.
یعنی داخل متد **MakeSound** می‌نویسیم: `base.MakeSound();`
این باعث می‌شه وقتی متد **MakeSound** سگ صدا زده می‌شه،
اول متد **MakeSound** کلاس پایه (Animal) هم اجرا بشه.
در واقع هم متد پایه رو اجرا می‌کنیم، هم کد خودمون رو.
یعنی فقط بازنویسیش نمی‌کنیم، بلکه اجرای اون متد اصلی رو هم صدا می‌زنیم.
به عبارتی هم رفتار پایه رو داریم، هم چیزای جدید خودمون رو بهش اضافه می‌کنیم.
قبلاً فقط رفتار خودمون رو اجرا می‌کردیم،
ولی الان می‌گیم: اول رفتار کلاس پایه اجرا بشه، بعد رفتار مخصوص سگ.
اگه الان برنامه رو اجرا کنیم، اول چاپ می‌شه: "Animal makes a generic sound"
و بعد: "Dog makes a barking sound"
یعنی دقیقاً دوتا خروجی پشت سر هم داریم.
البته این یه مثال خیلی ساده‌ست، ولی فرض کن بعضی وقت‌ها اصلاً دسترسی به کلاس پایه نداری.
نمی‌تونی کلاس پایه رو تغییر بدی.
درسته؟
خب.
مثلاً یکی از هم‌تیمی‌هات مسئول اون کلاسه و فقط اون می‌تونه تغییرش بده،
اما تو کدش رو نمی‌تونی ادیت کنی.
فقط می‌تونی ازش استفاده کنی.
می‌تونی متدهاش رو override کنی،
ولی خود کلاس پایه رو نمی‌تونی تغییر بدی.
یا فرض کن داری با یه framework یا کد شخص ثالث کار می‌کنی که خودت ننوشتی.
کدی که اونجوری که هست، باید ازش استفاده کنی.
و تو نمی‌تونی اون کد پایه رو دستکاری کنی، فقط باید باهاش کنار بیای.
خب حالا در این وضعیت،
می‌خوای از رفتار پایه‌ی اون کلاس استفاده کنی،
ولی یه چیزای مخصوص خودت هم بهش اضافه کنی.
درسته؟
اینجا باید مطمئن بشی که اجرای متد اصلی (متد کلاس پایه) همچنان انجام می‌شه،
بعدش کد خودت روش اجرا می‌شه.
یعنی اول `base.MakeSound()`، بعد قسمت مخصوص خودت.
همین.
ما تو این مثال مثل یه کاربر کامل یا توسعه‌دهنده‌ی "خدای‌گونه" هستیم که به همه‌چی دسترسی داره 😄
ولی تو دنیای واقعی این‌طوری نیست — تو همیشه به همه‌ی کدها دسترسی نداری.
و اگه بخوای کلاس پایه رو عوض کنی، ممکنه بقیه‌ی برنامه‌نویس‌ها که دارن از اون استفاده می‌کنن، متوجه نشن.
و یهو کل سیستم بهم بریزه 😅
فقط چون گفتی «می‌خوام کد پایه رو عوض کنم».
در حالی که باید فقط متد یا ویژگی مخصوص خودت رو تغییر می‌دادی.
اون بخش‌هایی که لازم داری متفاوت باشن، نه کد اصلی.
این یه نکته‌ی جانبی ولی خیلی مهمه توی طراحی شی‌ءگرا.
خب، تا اینجا همین.
تو ویدیو بعدی ادامه می‌دیم 😊 ---