خوش برگشتین.
خب حالا در این مرحله بالاخره آماده‌ایم که بریم سراغ بحث عمیق‌تر درباره‌ی Access Modifierها، چون تا حالا اون‌قدری که باید واردش نشده بودیم.
دلیلش هم این بود که یکی از اون‌ها هنوز موقعیت درستی برای توضیحش نداشت.
خب.
تا الان Public و Private رو دیدیم و فهمیدیم چطوری کار می‌کنن.
حالا بیایم ببینیم وقتی کلاس‌ها از هم ارث‌بری می‌کنن یا در حالت Inheritance چه رفتاری دارن.
اینجا یه Base Class داریم که سه تا Field داره، درسته؟
یکی Public هست، یکی Protected و یکی هم Private.
پس Public، Protected و Private داریم.
این‌ها همون Access Modifierها هستن.
Access Modifierها.
خب.
و این‌ها سه نوع متفاوت Access Modifier هستن.
یه نوع چهارم هم داریم به اسم Internal.
ولی وقتی صحبت از ارث‌بری میشه، همین سه‌تا مهم‌ترن.
یعنی Public، Protected و Private.
حالا داخل متد Public به اسم void showFields، متغیرهای مختلف رو داریم که دارم با Console نمایش‌شون می‌دم.
و حالا می‌ریم سراغ Derived Class من.
اینجا کلاس فرزند منه و اون بالا کلاس پدر یا Base Class.
یعنی Parent Class.
یا همون Base Class.
خب همون‌طور که احتمالاً حدس زدین.
حالا بیایم امتحان کنیم ببینیم می‌تونیم Fieldهای کلاس پدر رو دسترسی پیدا کنیم یا نه.
یعنی Public Field، Protected Field و Private Field رو ببینیم چطوری رفتار می‌کنن.
خب.
اول از همه می‌خوام مقدار Public Field رو تغییر بدم.
فرض کن عدد ۱ رو بهش می‌دم.
هیچ مشکلی نداره، Protected Field رو هم تغییر می‌دم.
می‌بینی؟ اونم جواب می‌ده.
اما حالا می‌خوام Private Field رو تغییر بدم.
و می‌بینی که اینجا ارور می‌گیرم.
می‌گه Field مربوط به Base Class.
Private Field به خاطر سطح دسترسیش قابل دسترسی نیست.
و این دقیقاً کاربرد Private رو نشون می‌ده.
Private یعنی فقط داخل همون کلاس قابل دسترسیه.
یعنی هر عضوی که Private باشه، فقط داخل همون کلاس در دسترسه، چه Field باشه، چه Property، چه Method.
هرچی جلوی اسمش Private باشه، از بیرون اون کلاس قابل دسترسی نیست.
خب.
اینجا می‌بینی که نمی‌تونیم Private Field رو از کلاس فرزند دسترسی پیدا کنیم.
چون Derived Class نمی‌تونه به Fieldهای Private دسترسی داشته باشه.
حالا، اگه بخوای یه Field قابل دسترسی باشه، باید مطمئن شی که Private نیست.
ولی اگه نخوای اون Field برای همه‌ی کلاس‌ها قابل دسترسی باشه، فقط برای کلاس‌های فرزند، اون موقع از Protected استفاده کن.
اینجاست که Protected به درد می‌خوره.
Protected در واقع نقطه‌ی تفاوت بین دو تای دیگه‌ست.
یه چیزی بین Public و Private محسوب می‌شه.
Public برای همه در دسترسه.
Private فقط برای همون کلاس.
Protected برای هر کلاس فرزند در دسترسه.
یعنی هر Derived Class.
و این برای همه‌ی اعضا صدق می‌کنه، نه فقط Fieldها.
برای Propertyها و Methodها هم همین‌طوره.
خب.
فقط می‌خواستم این بخش رو باهات تموم کنم و روشن‌ترش کنیم.
الان دیدی که چطور باید ازش استفاده کرد و کِی میشه و کِی نه.
خب.
حالا بریم یه Object از Base Class بسازیم.
مثلاً بنویسیم BaseClass myBaseClass یا همون BaseClass new BaseClass.
و حالا متد showFields رو صدا بزنیم.
و ببینیم چی میشه.
خب بریم اجراش کنیم.
و بعد یه Object از Derived Class هم بسازیم.
یعنی DerivedClass.
و showFields اون رو هم صدا بزنیم.
ببینیم نتیجه چیه.
می‌بینی؟ public صفر، protected صفر، همه‌شون صفرن.
دلیلش اینه که هنوز متدی که مقدار میده رو صدا نزدیم.
پس بیایم اون متد رو هم صدا بزنیم تا مقدارها تنظیم شن.
اینجا derivedClass.dot
و متدی که نوشتیم accessFields بود، درسته؟
خب همونه.
باشه.
حالا اجرا کنیم و ببینیم.
می‌گه public صفر، protected صفر، private صفر، و بعد public یک، protected دو و private صفر.
یعنی نتونستیم مقدار Private رو تغییر بدیم.
ولی هنوز می‌تونیم مقدارش رو ببینیم.
چون مستقیماً بهش دسترسی نداریم، اما داریم از طریق متد showFields اون رو می‌بینیم.
یعنی متد showFields داره مقدار اون متغیر Private رو نشون می‌ده.
فقط مقدارش رو، نه خود متغیر رو.
برای همینه که می‌تونیم مقدار Private Field رو ببینیم، ولی خود Field نه.
چون این نمایش از طریق متد پدر اتفاق می‌افته، نه مستقیماً.
پس به خود متغیر Private دسترسی نداریم، فقط به مقداری که اون متد نشون می‌ده.
نمی‌تونیم مقدارش رو تغییر بدیم یا مستقیم نمایش بدیم.
مثلاً نمی‌تونیم بنویسیم Console.WriteLine و مقدار Private Field رو چاپ کنیم.
چون Private هست.
خب، این شاید یه کم غیرمنتظره بوده باشه.
شاید هم نه، ولی خواستم این بخش رو روشن کنم.
که بدونی اینم بخشی از ماجراست.
خب.
پس اینم از این ویدیو.
تو ویدیوی بعدی می‌بینمت.
خدافظ.
خب.
همین بود.
تا بعد! ---