لسلام عليكم ورحمة الله وبركاته..
في الدرس السابق قمنا بتصميم فئة
Date ووضعنا فيها ثلاث صفات تمثل اليوم و الشهر و السنة. و قمنا بتصميم
وظيفتين احداهما تعطينا قيمة التاريخ و الأخرى لوضع و تحديد التاريخ.
في درس اليوم سنقوم بتصميم فئة تستخدم الـ Date هكذا:
في
البرنامج السابق في السطر الخامس قمنا باعلان متغير من نوع Date و أسميناه
birthday، اذاً نحن نحتاج الآن إلى عضو من فئة Date التي كتبناها في الدرس
السابق.
كي نعرف المتغير من نوع Date نكتب التالي:
لكي
نفهم الجملة السابقة، علينا أن ننظر إلى الصورة التالية. و هي تمثّل جزء
من الذاكرة. نريد ان نحجزه للمتغير birthDate من نوع Date.
كما
هو موضّح في الصورة ان قيمة المتغير في الذاكرة تمثلها علامات استفهام.
ذلك ان المتغير birthDate ليس كائن في حد ذاته. بل هو متغير لعنوان
الكائن.
كي تتم ترجمة الجملة السابقة بدون مشاكل يجب أن يكون ملف
Date.class موجوداً في نفس الحافظة. (في المستقبل سنتعلم انشاء الله كيف
نحدد أماكن الفئات). و لكن في الوضع الحالي سنكتفي بوضع هذا الملف مع
الملف السابق في نفس الحافظة.
الآن لكي ننشئ الكائن نفسه علينا أن نستخدم الطريقة التالية:
نلاحظ في السطر السابع من البرنامج الموضح في الصورة السابقة هذه الجملة:
هممم أعتقد أن لديك الآن العديد من الأسئلة، أليس كذلك؟
اذاً دعنا نكمل الشرح اليوم بطريقة الأسئلة و الأجوبة
مالفرق بين المتغير من نوع Date و المتغير من أي نوع آخر ممن ألقينا عليه الضوء في درس المتغيرات؟
ان
المتغير من نوع Date هو من فئة قام المبرمج بتعريفها. أي انه متغير يمثّل
عضواً من فئة. اما المتغيرات سابقة الذكر مثل int و char و boolean فهم
متغيرون لا ينتمون فعلياً لفئة محددة، و لكنهم يمثلون أنواع المتغيرات
البسيطة. ان المتغير Date يعتبر أكثر تعقيداً نوعاً ما.
لم قمنا باستخدام الكلمة new؟ و ما الفائدة من السطر السابع؟
سبق
و ضمن شرحنا للسطر الخامس من نفس البرنامج أن اوضحنا ان اعلان المتغيرات
من نوع الفئات أو ما نطلق عليهم Aggregate Data Types هي في الواقع اعلان
النيّة عن اعلان المتغير. و لكن ما حدث في السطر السابع، ان المترجم قام
بتهيئة جميع أجزاء التاريخ الفعلي، و أنشأ كائناً من نوع Date ثم وضع
عنوان الذاكرة لهذا الكائن في المتغير birthDate.
لم أفهم، أرجو التوضيح أكثر في السؤال السابق؟
دعونا نستخدم الرسوم التوضيحية، لمعرفة ما تم في هذه الجملة:
Date birthDate=new Date(); |
ان القسم الأول من الجملة (أو في برنامجنا ما هو موجود في السطر الخامس) يمكن تمثيله بالصورة التالية:
ان
القسم المظلل من الصورة يصور لنا ما يعنيه الجزء الأول من الجملة. انه
يعني اننا قمنا بانشاء متغير (علبة) تحفظ في داخلها عنوان كائن شيئي من
نوع Date. و لكن لاحظ أن القيمة المبدئية في المتغير غير معرّفة حتى هذه
اللحظة (قبل ان ننتقل لبقية الجملة). أي اننا نمهد لانشاء كائن من نوع
Date و لكننا لم ننشئه حتى الآن، لذا وضعنا في داخل المتغير birthDate
علامات استفهام.
أما الصورة التالية:
فهي
تظلل القسم الأخير من الجملة الذي يعني اننا سنقوم بانشاء كائن من نوع
Date في ذاكرة الكومبيوتر. و لنفرض مجرد فرض ان عنوان هذا المكان الذي
وضعنا فيه الكائن هو العنوان الموضح في اسفل المنطقة المظللة.
ملاحظة: ان المتغيرات day و month و year سيتم اعطاؤهم القيمة المبدئية (0) بشكل اوتوماتيكي. لأنهم ينتمون لكائن، و ليس لوظيفة محددة.
اننا
حتى الآن أنشأنا على أحد طرفي الجملة متغيراً لا توجد فيه أي قيمة. و في
الطرف الآخر أنشأنا في الذاكرة كائناً شيئيّاً من نوع Date. لاحظ ما سيحدث
الآن:
ان
علامة المساواة في هذه الجملة تعني ان عنوان الكائن الذي انشأناه في
الذاكرة سيتم وضعه في المتغير birthDate. و هذه هي طريقة اعطاء المتغير من
نوع Aggregate Data Type القيمة المبدئية.
هل المقصود ان عدم وضع القيمة المبدئية لأي متغير من هذا النوع يعني عدم القدرة على استخدام هذا المتغير؟
بالضبط!
ان المتغير الشيئي أو الكائني أو الذي نريد أن ننشيء عن طريقه عضواً من
فئة محددة لابد من اعطائه قيمة مبدئية باستخدام الكلمة new. لأنه كما
لاحظنا من السيناريو السابق، ان الاكتفاء بتعريف المتغير، يقوم بوضع
علامات استفهام في المتغير.
في هذا الدرس قمنا بانشاء المتغير من نوع Date في الدرس القادم سنستخدمه و نستخدم وظائفه المختلفة.
وفوق كل ذي علم عليم