الأربعاء، 17 أكتوبر 2012

المشيدات في جافا

المشيد أو دالة البناء "constructor" في جافا له نفس اسم الفئة التي ينتمي إليها. التركيب "syntax" للمشيد لا يتضمن عودة النوع "return type" بحيث ان المشيد لا يعود أبدا بقيمة "value".
قد تشمل المشيدات أو ما يسمى بدالة البناء "Constructors" معايير من مختلف الأنواع. عندما يتم استدعاء مشيد  باستخدام  مشغل "operator" جديد، فيجب أن تتطابق تلك الأنواع مع التي تم تحديدها في تعريف المشيد.
جافا يوفر مشيد افتراضي الذي لا يحتاج إلى الوسائط "arguments" و لا ينفذ أية إجراءات خاصة أو تهيئة " initialization" ، عندما لا يتم تقديم أية مشيدات واضحة.
الإجراء الوحيد الذي اتخذه المشيد الضمني الافتراضيه هو استدعاء مشيد الفئة المتفوقة باستخدام نداء super() . وسائط المشيد توفر لك وسيلة لتوفير معايير "parameters" تساعدك في تهيئة الكائن.
أدناه هو مثال لفئة cube (مكعب) تحتوي على 2 من المشيدات "Constructors". (مشيد افتراضي و مشيد  ذا معلمات ).


ملاحظة : إذا قامت فئة بتعريف مشيد واضح، فإن المشيد الافتراضي لم يعد لديه فاعلية لتعيين حالة الكائنات.
إذا تتطلب الفئة المشيد الافتراضي، فيجب توفير تنفيذه. فإن أي محاولة لاستدعاء المشيد الافتراضي سيؤدي الى خطأ في وقت التحويل البرمجي إذا لم يتم إتاحة مشيد افتراضي واضح في مثل هذه الحالة.

هيمنة مشيدات جافا  Java Overloaded Constructors  


مثل المناهج، يمكن أيضا أن تكون المشيدات قابلة للإلغاء "overloaded". وبما أن كل المشيدات في الفئة لها جميعا نفس اسم الفئة ، ولكن توقيعاتها متباينة بناء على قوائم  معلمات "parameter". المثال أعلاه يدل على أن المشيد Cube1 قام بعمليات إلغاء واحد من هذه العمليات جرت على المشيد الافتراضي و الأخرى على المشيد صاحب معلمات المحدد "parameterized constructor".
فمن الممكن استخدام this() لتنفيذ تسلسل محلي للمشيدات في الفئة . هذا النداء this() في المشيد يقوم باستدعاء منشئ آخر بمعلمات "parameter" متعلقة به مدرجة في الفئة نفسها. استدعاء المشيد الافتراضي لإنشاء الكائن مكعب "Cube"  ينتج عنه كذلك إستدعاء لثاني وثالث مشيد أصاحب المعلمات المحددة "parameterized constructors". جافا تتطلب أن يحدث أي نداء this() كأول بيان في المشيد.
أدناه هو مثال لفئة cube التي تحتوي على  3 مشيدات  الاتي سيوضحن المنهج this() في سياق المشيدات





Output

Finished with Parameterized Constructor having 3 params
Finished with Parameterized Constructor having 2 params
Finished with Default Constructor
Finished with Parameterized Constructor having 3 params
Volume of Cube1 is : 1000
Volume of Cube2 is : 6000


تسلسل المشيد  Constructor Chaining 


كل منشئ يدعوا المنشئ للفئة الفائقة الخاص به. المنهج الضمني super() موجود لكي يتم تضمينه لأي منشئ لا يحتوي على نداء المنهج  this() أو منهج super() واضح في بيانه الأول. بيان super() يستدع منشئ للفئة super.
ويمكن استبدال super() الضمني "implicit super" من قبل super() الصريح "explicit super" . يجب أن يكون بيان super أول بيان للمنشئ.
يسمح super الصريح "explicit super" بتمرير القيم المُعلَمَة "parameter values" لمنشئ  الفئة الفائقة، ويجب أن يكون أنواع المعلمات متطابق. نداء super() في منشئ الفئة الفرعية سيؤدي إلى نداء للمنشئ من الفئة الفائقة  استنادا إلى توقيع النداء. وهذا ما يسمى بتسلسل المشيد "constructor chaining".
أدناه هو مثال فئة تشرح لنا تسلسل المشيد "constructor chaining" بإستعمال المنهج super().




Output

Finished with Parameterized Constructor having 3 params of SpecialCube

Finished with Parameterized Constructor having 2 params of SpecialCube
Volume of SpecialCube1 is : 1000
Weight of SpecialCube1 is : 10
Volume of SpecialCube2 is : 2000
Weight of SpecialCube2 is : 20

اذا استخدمت super()  أو this() فيجب ان يُكَوِنوا البيان الأول في المشيد ، و لا يمكن أن يستخدموا إلا في اعلان المشيد. هذا يعني أن نداء this() و super() لا يمكن أن يحدث كِلاهُما في نفس المشيد. كما أن this() يؤدي إلى تسلسل المشيدات في نفس الفئة، و super() يؤدي إلى ترابط تسلسلي لمشيدات فئة فرعية بمشيدات الفئة الفائقة.
إذا كان المشيد ليس له this() و ليس له super() في بيانه الأول فيتم إدراج نداء super() للمشيد الافتراضي في الفئة المتفوقة.

ملاحظة : إذا قامت فئة بتعريف مشيدات غير الافتراضية، فإن فئاتها الفرعية لن تشمل نداء super() ضمني "implicit super" . هذا سيكون بمثابة علامة خطأ في وقت التحويل البرمجي. يجب علي الفئات الفرعية ان تقوم بنداء صريح لمشيد الفئة الفائقة ، استخدام super() مع الوسائط "arguments"  الملائمة لتتطابق مع المشيد المناسب من الفئة المتفوقة.
أدناه هو مثال فئة يشرح لنا تسلسل المشيد "constructor chaining" بإستعمال النداء super() الصريح  "explicit super".


Output

Finished with Parameterized Constructor having 3 params of Cube
Volume of SpecialCube1 is : 6000

ليست هناك تعليقات:

إرسال تعليق