mcse
مرحباا بك في منتدى mcse
تشكرك الادارة على هده الزيارة


انضم إلى المنتدى ، فالأمر سريع وسهل

mcse
مرحباا بك في منتدى mcse
تشكرك الادارة على هده الزيارة
mcse
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

(16) الـ Constructors

اذهب الى الأسفل

(16) الـ Constructors Empty (16) الـ Constructors

مُساهمة من طرف Ebisu الأربعاء يونيو 16, 2010 11:50 am

لسلام
عليكم
و رحمة الله و بركاته


في
الدرس
السابق
قمنا بعمل مهم جداً. و سنقوم اليوم بنفس العمل و لكن بطريقة
أسهل.
باستخدام مفهوم الـ Constructor.



أرجو أن تقوم
بقراءة
المقدّمة على الأقل من الدرس السابق (إن لم تكن فعلت) و الأفضل أن تطلع
عليه
بأكمله حتى تكون على علم بما نفعله هنا.



تمهيد
:
لننظر إلى
هذه البرامج الثلاثة سابقة الذكر و الشرح في
الدرس السابق
:

لقد قمنا بتعريف
فئة
النقطة في الدرس السابق بهذا الشكل:

<blockquote>

(16) الـ Constructors Point01

</blockquote>
ان تعريف لفئة النقطة بهذا الشكل
يجعلها
تواجه مشكلة. و هي أننا نضطر للاعطاء قيماً لمتغيراتها x
و y بشكل يدوي في الفئات الأخرى التي
تستخدمها و
تستدعيها. كما فعلنا في هذه الخطوات من فئة Painter:


<blockquote>
(16) الـ Constructors Painter01p4
</blockquote>
إذا نحن بحاجة لوسيلة تجعلنا
أثناء تكوين
أي عضو من فئة النقطة Point أن نعطي قيماً
لمتغيراته. ما أقصده بالتكوين هو هذه الجملة:

<blockquote>
(16) الـ Constructors New
</blockquote>

إن
عبارة
(16) الـ Constructors New1
تعني أننا سنقوم باستخدام بتكوين عضو فعلي من فئة
النقطة
Point. هممو لكن ألا تلاحظون شيئاً؟.. لاحظو
معي أن
(16) الـ Constructors New2
اسم الفئة نفسه يليه قوسان. و هذا ما يعرف بالـ Constructor.
وهو عبارة عن طريقة التكوين التي يتم بها انشاء العضو من الفئة.




كيف

نقوم بإعادة تعريف ال
Constructor؟
إن
(16) الـ Constructors New2
يعرف باسم: Default Constructor. و هي الذي
توفره أي
فئة موجودة في الآلة التخيلية. و لا يحتاج المبرمج لتعريفه و لا
للإشارة إلية.


و يمكن للمبرمج إذا أراد أن يقوم بتعريف الـ
Constructor الذي
يريده. لنفرض مثلاً في فئة النقطة. أننا
أردنا يقوم المبرمج بتمرير قيماً صحيحة للمتغيرين x
و y أثناء تكوين العضو من فئة النقطة Point.
أي لنفرض أنه أراد أن يكتب هذه الجملة:
(16) الـ Constructors Niceway

بدلاً من هذه الطريقة:
(16) الـ Constructors Badway


الطريقة الأولى طريقة لطيفة أليس كذلك؟ أفضل و اسهل
عند
استخراج الأعضاء من فئة النقطة.

لنتأمّل الكود التالي الجديد لفئة النقطة نفسها:

<blockquote>
(16) الـ Constructors Point02
</blockquote>
لاحظ السطر 6. ستجد أننا كتبنا
كوداً قد
يبدو عجيباً للوهلة الأولى:

<blockquote>
(16) الـ Constructors Constructor
</blockquote>
نلاحظ أننا كتبنا اسم الفئة، و
هي في
حالتنا Point، ثم فتحنا أقواساً. و في داخل
الأقواس
قمنا بتعريف سلسلة من المتغيرات تفصل بينهما الفاصلة (,).


من الضروري جداً جداً أن نكتب
سلسلة
المتغيرات بترتيب محدد. أي أننا نقوم بتوقع الاحداثي السيني، ثم
الاحداثي
الصادي و ليس العكس.

<blockquote>
(16) الـ Constructors Cons
</blockquote>
لاحظ في نهاية السطر السادس يوجد
قوس
مجموعة. مما يعني أننا سنقوم بكتابة بعض الكود و لا تنس أن تغلق قوس
المجموعة
بعد الانتهاء من كتابة ما تريد.

والآن لننظر إلى داخل الـ
Constructor. ما الذي قمنا بتعريفه. في السطر 7 و
8. نلاحظ
أننا أخذنا القيم من المتغيرات التي مررت لنا عبر تكوين العضو، و
وضعناها في
المتغيرات الخاصة بالعضو.

المتغيرات الممررة xx
و yy هي متغيرات مؤقتة. تنتهي بمجرد
الانتهاء من
تكوين العضو (و الوصول لقوس المجموعة الموجود في السطر التاسع. و لعلنا
نفصّل
في هذا أكثر في درس الوظائف ان شاء الله.

<blockquote>




نقطة توقّف..

عندما تحدثنا عن الـ Constructor
الافتراضي. و قلنا أنه يتوفّر بشكل افتراضي لأي فئة. فإن ذلك
يتم إذا
كانت الفئة لا تحتوي على Constructor
أما
اذا قام المبرمج بتعريف Constructor
خاص به،
فإن الـ Constructor الافتراضي أو
default constructor ذو القوسين الفارغين
لا يتم
ايجاده. أي أن عبارة
(16) الـ Constructors New
ستنتج خطأً في الترجمة. ذلك أن الconstructor
الموجود يختلف في عدد المتغيرات الممررة عن
(16) الـ Constructors New2.

إذا رغب المبرمج في
constructor ذو سلسلة متغيرات ممررة فارغة
مثل:
(16) الـ Constructors New2،
فعليه أن يكتبه بنفسه.

يمكن للفئة أن يكون لها
أكثر من
constructor. كل منهم يختلف عن
الآخر في عدد
أو نوع المتغيرات في السلسلة الممررة لكل منهم، أو كلاهما.


</blockquote>



البرامج مرة أخرى:


آن و قد تعلمنا
الـ
constructors. نستطيع كتابة البرامج
الموجودة في
الدرس السابق بشكل أفضل مما سبق.


فبرنامج النقطة
سيكون
بهذا الشكل كما كتبناه معاً قبل قليل:

<blockquote>


(16) الـ Constructors Point02
</blockquote>

لنحاول أن نكتب
برنامج
الخط المستقيم بنفس الطريقة. بأن نقوم بتجهيز constructor
خاص به، هكذا:

<blockquote>


(16) الـ Constructors Line
</blockquote>

نلاحظ أننا
استخدمنا نفس
المفهوم. قمنا بتعريف constructor له
متغيرين في
سلسلة التمرير parameter list من نوع Point.



والآن لنلق نظرة
على
الفئة Painter:



(16) الـ Constructors Painter

لندرس معاً
الأسطر من 5
إلى 8:

<blockquote>


(16) الـ Constructors Line12
</blockquote>

قليل من التركيز
من
فضلك. فالآن المرحة الحرجة التي نقوم فيها بتطبيق ما قمنا بالتجهيز له
مع بداية
الدرس.


السطر 5، نقوم
فيه
بتعريف أو اشهار اثنين من المتغيّرات من نوع Line.
اسم الاول line1 و الثاني line2.



في السطر 7 نقوم
بعدة
خطوات. انظر الشكل:

<blockquote>


(16) الـ Constructors Explain
</blockquote>

لنذهب إلى
الخطوة رقم 1
و التي تجدون بجانبها رقمين 10 و 10, هما الاحداثيين السيني و الصادي
للخط
الأول. الآن نريد أن نكوّن منهما نقطة.


لننتقل للمرحلة
رقم 2. و
التي تجدون بجانبها هذه الجملة
(16) الـ Constructors New3

و هي تعني أننا سنقوم بتكون عضو في الذاكرة من نوع Point.
و لأن فئة النقطة Point توفر constructor
يأخذ رقمين صحيحن من نوع int أثناء تكوين
العضو.
فأصبح بإمكاننا الآن وضع الرقمين 10 و 10 في الأماكن المشار لها
بالأسهم.



حسناً رائع
جداً. والآن
لننزل إلى السطر نفسه (سبب البلاوي اللي نحن فيها من الصبح
هاهاهاهاها).


<blockquote>


(16) الـ Constructors Line1
</blockquote>

حسب تعريف الـ
constructor الموجود في الفئة Line
ما نوع المتغير المتوقّع هنا؟ Point. فعلاً.
و هذا
بالضبط ما فعلناه. قمنا بوضع العضو الذي استخرجناه في الخطوة 2 في
المكان الذي
يفترض أن يكون فيه متغير من نوع نقطة.

<blockquote>




نقطة توقّف..

سيتساءل بعضكم هنا. لماذا لم نقم بتعريف
متغير من
نوع نقطة Point هكذا:

<blockquote>


(16) الـ Constructors Pointag

</blockquote>


لنسأل أنفسنا. ما
الاستخدام الذي
سنستخدم فيه المتغير في هذه الحالة؟ اننا نريد أن نمرره عبر
constructor الخط المستقيم. و لن نقوم
باستخدامه
بعد ذلك أبداً. إذا في المسألة حجز لموارد النظام. لأننا نريد
تمرير
القيمة التي سيتم تخزينها في عضو آخر (وهو العضو الفعلي
الموجود في فئة
الخط المستقيم Line.

حتى تتوضح المسائل أكثر.
سنقلب
المسألة. تخيل أن لدي خطاً مستقيماً فيه عضوين من فئة النقطة
Point. و لكن لم يتم تحديد قيمهما بعد.

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

أتصور أن الحل الثاني هو
الأنسب.
و هذا ما فعلناه فعلاً. قمنا بانشاء الأعضاء داخل استدعاء
constructor الـ Line، و
بمجرّد أن تمرر قيمتهما، لن يبقى لهما وجود. و هكذا نحافظ على
مصادر
النظام في الذاكرة.

من الممكن طبعاً استخدام
الطريقة
الأولى، و لكن الطريقة الثانية عادة برمجية محمودة.


</blockquote>

وطبعاً
في
نهاية البرنامج و في الأسطر من 10 إلى 20 نفس أوامر الطباعة التي
ذكرناها في
الدرس
السابق.





ملاحظات مهمة:


  • يمكن تعريف
    الكونستراكتور بحيث يكون فارغاً من الكود.
    بل قد تكون لديك أسباب لذلك.

  • إذا قمت بتعريف constructor
    خاص بك، فأنك تفقد الـ constructor
    الافتراضي،
    فإذا أردت أن تحتفظ به، عليك أن تقوم بكتابته يدوياً.

  • يمكن أن يكون لنفس الفئة أكثر من Constructor
    يختلفون في أعداد أو أنواع المتغيرات في سلسلة المتغيرات الممررة
    لهم، أو
    كلاهما.

  • شكل الـ Constructor قد
    يشبه شكل الوظيفة، و لكن تذكّر دائماً. اسم الـ Constructor
    هو نفس اسم الفئة، و لا يوجد له نوع بعكس الوظيفة.

  • إن عمل new هو
    انشاء العضو
    من الـ constructor المناسب. فإذا لم يوجد

    constructor في الفئة. تقوم new
    باستخدام الـ constructor الافتراضي :-)



أرجو
أن
يكون الدرس واضحاً :-)
Ebisu
Ebisu
مبرمج جيد
مبرمج جيد

عدد المساهمات : 45
السٌّمعَة : 50
تاريخ التسجيل : 11/06/2010
العمر : 43

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى