۷ محمدجوکار
سوال از قوانین Access Modifiers در مسئله override
جامعه پی اچ پی ایجاد شده در ۰۹ بهمن ۱۴۰۱

سلام و احترام

الان که داشتم تست میکردم، انگار در مسئله آورراید، امکان تغییر سطح دسترسی به متدها هم وجود داره؛ ولی مسئله اینه که متد پرنت اگر پابلیک باشه، ما نمیتونیم در متد‌های چایلد، چیزی به جز پابلیک بزاریم.

برعکس این موضوع،‌ ممانعتی نداره!! یعنی دقیقا میشه متدی که در کلاس پرنت هست، پرایوت یا پراتکتد باشه ولی سطح دسترسیش، در کلس چایلد، به پابلیک تغییر کنه... خب این تناقضات دلیل خاصی دارند؟؟؟؟

783a-Screenshot (658).png

bf96-Screenshot (659).png

خب ظاهرا یه فرمول میتونه داشته باشه:

اگر سطوح دسترسی رو بخوایم به نحوه‌ و ترتیب زیردر ذهنمون تداعی کنیم، میتونیم از فرمولی که میگم استفاده کنیم

private
protected
public

متدی که در کلاس پدر تعریف میشه، اگر قرار باشه در کلاس‌های فرزند، آور راید بشه، نحوه‌ی قرار دادن سطوح دسترسیش طوریه که یا باید خود اون دسترسی که قبلا داشته رو بگیره، یا چیزایی که زیرش وجود دارن (با توجه به ترتیب بالا).

فرمول شد: یا خودش، یا زیریاش

یعنی اگر متدی در کلاس پدر private بود، در کلاس‌های فرزند یا باید همون private باشه، یا گزینه‌های زیرش؛ یعنی protected و public

اگر متدی در کلاس پدر protected بود، در کلاس‌های فرزند یا باید همون protected باشه، یا گزینه‌های زیریاش، یعنی public

اگر متدی در کلاس پدر public بود، در کلاس‌های فرزند فقط میتونه همون پابلیک باشه.

چرا؟؟؟ چون دیگه زیر نداره :)))

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۰۷:۴۶

سلام محمد عزیز

شما تایپ متدها رو توی کلاس‌های فرزند میتونید تغییر بدید و فرمولی نداره چون اورراید میشه.

احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۲:۳۵

خیر اینطوری نیست

اگر متد در کلاس پدر،‌ پابلیک باشه، راهی به جز پابلیک گذاشتنش نیست

و همینطور بقیه موارد که گفتم بالا.

c3a7-Screenshot (666).png

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۱۷:۲۴

بنده برای سایر تایپ‌ها عرض کردم.

بعد از پابلیک سطح دسترسی ای وجود نداره.

احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۸:۴۵

8a6c-Screenshot (669).png

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۱۹:۰۵

از متد‌های پرایوت خارج از کلاس نمیشه استفاده کرد.

شما تایپ foo رو باید پروتکتد یا پابلیک قرار بدید.

بهترین پاسخ
احمدرضا فاطمی کیا ۰۹ بهمن ۱۴۰۱، ۱۹:۰۶

ممنونم از پیگیری

محمدجوکار ۰۹ بهمن ۱۴۰۱، ۲۱:۲۸