ذكرنا بالدرس السابق بعض مفاهيم الـ OOP , وقمنا بإنشاء class أب و من ثم object منه يرث عنه جميع صفاته , وذكرنا أنه بمجرد كتابة اسم الكائن ويليه ( . ) سنصل لأي متغير أو أي دالة من دوال الـclass الأب . اليوم سنستكمل هذه المفاهيم بإذن الله!!
Using this reference :
نعود مرة أخرى لبرنامج الدرس السابق, في الـ Class2 نريد أن نعرف كيف نصل للمتغير ( i ) من داخل أي دالة من دوال هذا الكلاس , أي ما هي الطريقة المتبعة للوصول لأي Instance variable or method ؟؟...والطريقة المتبعة في ذلك هي استخدام الكلمة المفتاحية this في الوصول له. سنعيد كتابة الـ Class2 لنرى كيف يمكننا الوصول للمتغير i :
و الوصول لأي Instance Variable من داخل دالة من الدوال يمكن باستخدام this reference كما في المثال السابق, أو بدونها ..
و أيضا تستخدم في الـ Windows Application لكي تشير إلى الـ form الحالي كما سنرى فيما بعد.
والاستخدام الأمثل لها يظهر في حالة لو كان لدينا دالة تستقبل قيم (argument) وأسماء هذه الـ argument هي نفس أسماء الـ Instance variable ففي مثل هذه الحالة كلمة this داخل الدالة تشير إلى الـ Instance Variable , أما إذا أردنا التعامل مع البارميتر الخاصة بالدالة فلن نكتب this ..
لاحظ المثال التالي :
الخصائص Properties :
نعود مرة أخرى لبرنامج الدرس السابق ونحاول الوصول للمتغير ( i ) ولكن هذه المرة من خارج الكلاس Class2 أي من الكلاس Class1, بنفس الطريقة التي توصّلنا فيها للدالة Class2Method بالدرس السابق , على اعتبار أننا نريد تعيين قيمة جديدة للمتغير :
قم الآن بتشغيل البرنامج ... سيقوم الـ Compiler بإظهار رسالة خطأ:
و السبب في حدوث مثل هذا الخطأ يؤكد المعلومة التي ذكرناها بالدرس السابق "الدوال والمتغيرات التي يتم تعريفها بواسطة الـ Access modifier من النوع private لا يمكن الوصول إليها من خارج الكلاس التي أنشئت فيه " وهنا فنحن نحاول الوصول من الكلاس Class1 , للمتغير i من النوع Private والذي تم تعريفه داخل الكلاس Class2 ...
ولكن هل ستظل هذه المتغيرات التي يتم تعريفها بواسطة private لا يمكننا الوصول إليها أبدا ؟!!
بالطبع لا, فلا بد من وجود ميكانيزم محدد للتعامل مع مثل هذه الحالة وهو ما يعرف بـ Properties والذي سنتعرف عليها في الأسطر القليلة القادمة من الدرس حيث أننا سنقوم بكتابة property لكل private member .
الـ properties تسمح لنا بالوصول إلى الـ private member , تتكون من دوال تسمى Accessor method , وتعريف الـ property يتكون من get accessor أو set accessor أو كلاهما .
تتم كتابتها كالتالي :
public Private-member-type property-Name
get {return private-member; }
set {private-member = value; }
بحيث أن :
get accessor : تسمح بقراءة قيمة الـ private member .
set accessor : تسمح بتغيير قيمة الـ private member .
و هذه الـ accessor method يجب أن تراعي بها عدة شروط :
• أن تعرف هذه الدوال على أنها public .
• يكون بداخلها two blocks أحدها للـ get والآخر للـ set , أو one block لأحدهما .
• هذه الدوال لا يكون لها بارميتر أي أنها لا تستقبل قيم .
• كل دالة تعود بنفس نوع الـ private member .
وهذه الـ private member لو كنت أريدها :
Read only :سنستخدم get accessor فقط .
Write only : سنستخدم set accessor فقط .
Read & write : سنستخدم كلاهما .
ستتضح الفكرة إن شاء الله مع المثال التالي :
الكلاس التالي يختص ببيانات شخص اسمه وعمره وهي private و سنرى كيف نستخدم الـ property للوصول لقيمتي الاسم والعمر وإمكانية تغييرها .

- الأسطر (11-17) : قمنا بعمل الـ property للمتغير myName وأسميناه MyName
get في الأسطر(13-14) تعود لنا بالقيمة myName
set في الأسطر (15 -16) تضع القيمة الجديدة value في myName.
- الأسطر (19-29): هنا الـ property للمتغير myAge و أسميناه MyAge
get تعود بالقيمة myAge
set تضع القيمة الجديدة value في myAge ولكن هنا القيمة التي يتم تخزينها في myAge تتم بعد اختبار الشرط
و لاحظ وجود الكلمة المحجوزة value في set فهي تمثل القيمة القادمة للـ set accessor .
- في الكلاس MainClass :
السطر (37) : أنشأنا object من الـكلاس Person أسميناه newPerson .
السطر (38) : في جملة الطباعة هنا نستدعي قيمة المتغيرين myName و myAge ولكن ليس بمناداتها مباشرة وإنما عن طريق مناداة الـ property لكل منهما MyName و MyAge ثم تتم طباعتها على الشاشة .
طبعا بمجرد وصول الكومبايلر لهذا السطر فإنه سينتقل مباشرة إلى السطر 14 ليعود بالقيمة myName , ثم إلى السطر 22 ليعود بالقيمة myAge ثم يعود للسطر 38 مرة أخرى لتتم طباعة النتيجة على الشاشة . (شاهد السطرين الأول والثاني من المخرجات)
السطر(41): بمجرد وصول الكومبايلر لهذا السطر سينتقل مباشرة للسطر 16 ليضع القيمة value وهي Ebraheem بداخل myName عن طريق set accessor .
السطر(42) : بنفس الطريقة بمجرد وصول الكومبايلر لهذا السطر سينتقل للأسطر (23-29) ليجري الاختبار على القيمة 17 إن كانت أقل من أو تساوي 100 سيضعها كما هي داخل المتغير myAge , وإن كانت اكبر سيضع القيمة 0 بداخل myAge .
ثم بالسطر (43) : جملة الطباعة ستتم استدعاء قيمة المتغيرين myName و myAge عن طريق الـ property الخاص بكل منهما , لتتم طباعتها كما حدث تماما في السطر 38. (السطرين 3 و 4 من المخرجات) .
وبذلك تمكنا من الوصول لقيم الـ private member و تغيير قيمها باستخدام هذا الميكانيزم .
المخرجات:

و أمثل و أمتع طريقة لفهم هذه الأمور هي تتبُّّع عمل الـ compiler باستخدام الـ
break point !!.