سطح دسترسی Protect
سطح دسترسی protect اجازه میدهد که اعضای کلاس، فقط در کلاسهای مشتق شده از کلاس پایه قابل دسترسی باشند. بدیهی است که خود کلاس پایه هم میتواند به این اعضا دسترسی داشته باشد. کلاسهایی که از کلاس پایه ارث بری نکردهاند نمیتوانند به اعضای با سطح دسترسی protect یابند. در مورد سطوح دسترسی public و private قبلاً توضیح دادیم. در جدول زیر نحوه دسترسی به سه سطح ذکر شده نشان داده شده است :
قابل دسترسی در | public | private | protected |
داخل کلاس | true | true | true |
خارج از کلاس | true | false | false |
کلاس مشتق | true | false | true |
مشاهده میکنید که public بیشترین سطح دسترسی را داراست. صرف نظر از مکان، اعضای public در هر جا فراخوانی میشوند و قابل دسترسی هستند. اعضای private فقط در داخل کلاسی که به آن تعلق دارند قابل دسترسی هستند. کد زیر رفتار اعضای دارای این سه سطح دسترسی را نشان میدهد :
1: using System; 2: 3: class Parent 4: { 5: protected int protectedMember = 10; 6: private int privateMember = 10; 7: public int publicMember = 10; 8: } 9: 10: class Child : Parent 11: { 12: public Child() 13: { 14: protectedMember = 100; 15: privateMember = 100; 16: publicMember = 100; 17: } 18: } 19: 20: class Program 21: { 22: public static void Main() 23: { 24: Parent myParent = new Parent(); 25: 26: myParent.protectedMember = 100; 27: myParent.privateMember = 100; 28: myParent.publicMember = 100; 29: } 30: }
کدهایی که با خط قرمز نشان داده شدهاند نشان دهنده وجود خطا هستند، چون فیلدهای protect و private در خارج از کلاسی که به آن تعلق دارند یعنی کلاس Parent، غیر قابل دسترسی هستند. همانطور که در خط 15 مشاهده میکنید کلاس Child سعی میکند که به عضو private کلاس Parent دسترسی یابد. از آنجاییکه اعضای private در خارج از کلاس قابل دسترسی نیستند، حتی کلاس مشتق در خط 15 نیز ایجاد خطا میکند. اگر شما به خط 14 توجه کنید کلاس Child میتواند به عضو protect کلاس Parent دسترسی یابد چون کلاس Child از کلاس Parent مشتق شده است. حال به خط 26 جاییکه میخواهیم در کلاس Program به فیلد protect کلاس Parent دسترسی یابیم نگاهی بیندازید. میبینید که برنامه پیغام خطا میدهد چون کلاس Program از کلاس Parent مشتق نشده است. همچنین کلاس Program به اعضای private کلاس Parent نیز نمیتواند دسترسی یابد.