(15) صفة في فئة عبارة عن عضو من فئة أخرى

لسلام عليكم و رحمة الله و بركاته
(ملاحظة: يحتوي الدرس على عدد من الصور التي اجتهدت في اختزال حجمها قدر الاستطاعة، أرجو الصبر)

درسنا اليوم فيه شيء من الطول، و شيء من التفصيل. من فضلك لا تقرأه إلا و أنت في حالة ذهنية صافية غير مشوشة.. لأفضل النتائج.. والله الموفّق :-)   على فكرة.. فيه بعض الرياضيات أرجو أن يسعدكم هذا لعلمي بولع المبرمجين (وأنا منهم) بالرياضيات :)

تمهيد:

لنجرب أن نضع فئة الإنسان. ماهي صفاته و قدراته؟

عين، لسان، قلب، انه يفكر، يبدع.

ممتاز.

لنتصوّر أننا نرغب في كتابة فئة القلب. و نضع فيها صفات أي قلب:

يضخ الدم، ينبض.

رائع جداً..

الآن تصوّر أن عضواً من فئة القلب سيكون صفة لعضو فئة الانسان..

لغز؟ لنحلّه معاً عبر درس اليوم :)

 

مقدّمة المثال:

لنفترض أننا نرغب في بناء فئة للخط المستقيم. و حتى نبدأ فعلياً في ذلك. لابد من أن نعرف المزيد عن خصائص و مميزات الخط المستقيم أليس كذلك.

لنسأل أنفسنا: ماهو الخط المستقيم؟ حتى نجيب على هذا التساؤل لابد أن نعرف القليل عن خصائص الخط المستقيم. لنتأمّل الشكل التالي:
 







 

كما ترى في الشكل. لدينا نقطتان النقطة الأولى: P1 و الثانية P2. و يربط بينهما الخط المستقيم. إذا الخط المستقيم هو كل ما يربط بين نقطتين، أليس كذلك؟ حسناً إذا احداثيات النقطة الأولى P1 و احداثيات النقطة الثانية P2 يحددان معاً كيف نرسم الخط المستقيم.
 

نقطة توقّف..

قد يقول قائل منكم أن للخط لوناً وهو في الشكل اللون الأسود. فأقول صحيح. اللون صفة من صفات الخط. و قد يقول آخر أن لون النقاط أحمر فأقول خطأ. لأن لون النقاط من صفات النقاط و ليس من صفات الخط ;-) فلا تخلط الأمور.

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

لم تستوعب النقطة؟ لا تخف أبداً.. تابع الدرس و ان شاء الله تتوضح الأمور :)

إذاً لدينا الآن فئة الخط المستقيم Line. و لكن في حالتنا اليوم نحن مضطرون إلى بناء فئة أخرى.. ما هي؟

صحيح.. فئة النقطة و لنطلق عليها Point و أي نقطة في العالم تتكون من احداثيين (س، ص) أليس كذلك؟ و باللغة الانجليزية: (x,y).  لننظر إلى الشكل التالي:
 

فنلاحظ الشكل المجاور قليلاً.. ستجدون النقطة الحمراء و الممثلة بالنقطة P1 تعكس اثنين من الاحداثيات. أحدهما ينعكس على المحور (س) والآخر ينعكس على المحور (ص).

و نلاحظ أيضا في الأرقام التي تجاور النقطة ان الاحداثي السيني تم تعريف أولاً. ثم تم تعريف الاحداثي الصادي.

و لكي نكتب الفئة في اللغة الانجليزية أرجو ملاحظة أن س= x، و أن ص=y. كما ارجو ملاحظة اتجاه اللغة. حيث ان الاتجاه بالانجليزي سيكون من اليسار لليمين هكذا: (x,y).

ملاحظة: سامحوني على رداءة خطي ههههههه :-)

 

كتابة البرامج:

الآن و بعد هذه الدراسة المتعمّقة في الهندسة الاحداثية. (أرجو أنها كانت خفيفة على قلوبكم) نستطيع ببساطة أن نبني معاً فئة النقطة أو Point. لنتأمّل الكود التالي:

لقد قمنا هنا بتعريف أبسط فئة للنقطة Point و هي فئة لها اثنتين من الخصائص. احداثي السينات، و احداثي الصادات :)

الآن سنقوم بكتابة ملف فئة الخط المستقيم. لنتأمّل الكود التالي:

تجدون أن الخط المستقيم له صفتان تميزانه (أو بمعنى أصح تميّزان أي عضو نقوم باستخراجه من هذه الفئة) و هما النقطة الأولى p1 و النقطة الثانية p2.

والآن لنلخّص ما فعلناه. لقد كتبنا فئة و هي فئة النقطة Point و هي فئة قائمة بذاتها. ثم كتبنا فئة الخط المستقيم Line و استخدمنا في تعريفها عضوين من الفئة الأولى. فالنقطة p1 في فئة الخط المستقيم عبارة عن صفة لعضو. و هي بحد ذاتها عضو من فئة النقطة Point. أتمنى أن تكون هذه النقطة واضحة :-)

والآن سنكتب برنامج ثالث مثلاً ليكون هو البرنامج الذي نستخدم فيه أعضاء من فئة الخط المستقيم مثلاً. و سأسمّيه Painter لأننا ان شاء الله سنكتب في نهاية هذه الدورة برنامج رسم بسيط :-) حسناً لنتأمّل هذا الكود:

لا تخف لا تخف :-) سنشرحه جزءاً جزءاً. بالطبع الهيكل العام للبرنامج مفهوم وواضح من دروس سابقة.

شرح كود برنامج Painter:

لننظر إلى الشكل:

نلاحظ عرض السطرين 5 و 6 فيهما استخراج عضوين هما line1 و line2 من فئة الخط المستقيم. ثم قمنا بعد ذلك بحجز الذاكرة لهما لكونها من فئة قمنا بتعريفها (Aggregate Data Type) كما شرحنا في الدرس الثالث عشر. هنا الطريق تمام و مفتوح


لننظر للشكل التالي:

في الشكل الأعلى نجد الأسطر من 8 و حتى السطر 13. في السطر الثامن نجد تعليقاً يخبرنا أننا سنقوم الآن بإعداد النقاط في السطرين اللذين قمنا بتعريفهما للاستخدام. لأننا لو تذكر في تعريفنا للخط المستقيم لم نقم باستخدام new لحجز المساحة لكلتا النقطتين. و هكذا وجب علينا في هذا البرنامج أن نقوم بذلك.
 

نقطة توقّف..

إن هذه الخطو ضرورية جداً جداً جداً جداً جداً. ستسأل لماذا.. تذكّر معي أننا قمنا بتعريف الخط المستقيم في البرنامج بأن فيه عضوين من فئة النقطة Point. و لم نقم بعد بحجز أي مساحة لهذين العضوين.

و هكذا لابد أن نقوم بحجز المساحة للنقطتين الخاصتين بالخط الأول و كذلك النقطيتن الخاصتين بالخط الثاني. و إذا لم نقم بهذا العمل. فنحن في الواقع لن نتمكّن من تشغيل البرنامج لأن النقاط ليست جاهزة للاستخدام و لن نتمكّن في الواقع من استخدام x و y لأي نقطة. لأنه بكل بساطة النقاط ليست موجودة و لم يتم حجز الذاكرة المناسبة لها بعد. راجع الدرس الثالث عشر لمزيد من المعلومات حول هذه النقطة.

هل تعتقد أن هذه مشكلة يجب أن نجد لها حلاً. تفكير رائع :-) وهذا ما سنفعله في الدرس القادم من هذا الموضوع.


لننظر للشكل التالي:

هنا نجد الأسطر من 15 إلى 19. و في السطر 15 نجد تعليقاً يخبرنا أننا سنقوم بإعطاء قيماً للخط المستقيم line1 . و هذا يعني أننا سنحدد النقاط التي يصل بينهما. و بتفسير أكثر سنقوم بتحديد الاحداثيات السينية و الصادية لكلتا النقطتين. نلاحظ أننا استخدمنا الـ dot notation هنا و هذا يعني انني سأقوم باستخدام صفة (في حالتنا) خاصة بالعضو الذي ينتمي للفئة Line. لننظر لدفتر الرسم البياني و نحاول رسم هذا الخط الذي يربط بين النقطتين (10,10) و (20،20).

هل الخط المستقيم الأول واضح الآن؟ أرجو ذلك :-)


والآن لننظر للشكل التالي:

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

أرجو أن يكون هذا الجزء واضحاً تماماً بالنسبة لكم.


والآن لنتابع الجزء الأخير:

الأسطر من 27 إلى 37 تقوم بطباعة السطر بشكل متب كما في أي سطر طباعة آخر. تطبعه على الشاشة.

كل ما في الأمر أننا قمنا بترتيب المخرجات.

نقطة توقّف..

استخدام اشارة (+) في داخل جملة الطباعة لا تعني أننا سنقوم بالجمع. إلا في حالو واحدة وهي أنه وُجد على طرفي هذه الإشارة داخل أمر الطباعة عددين قابلين للجمع. و حتى هذا ليس الحال دائماً. لأنه يعتمد في بعض الأحيان على ترتيب المتغيرات و موقعها في جملة الطباعة نفسها.

علامة الجمع بين المتغيرات من نوع String و هي التي تمثلها العبارات المحصورة بين علامتي التنصيص " و "، يعني أنه سيتم جمع هذه العبارات. و هذا ما تفعله جملة أو أمر الطباعة System.out.println.

التشغيل:

إنّك إذا قمت بكتابة جميع البرامج بشكل صحيح، فإنّك بعد عمل الترجمة  Compile للملفات الثلاثة، و تشغيل الملف الأخير Painter، فإنه سيظهر لك هذا الناتج:

الخاتمة:

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

ملاحظة برنامجنا حتى الآن لا يقوم بالرسم.. و لكنه سيفعل ان شاء الله :-) كل ما هنالك أننا نبنيه جزءاً جزءاً. فالصبر يا إخوان.

تحياتي
JavaGirl

 

 

 


Copyright © www.kettaneh.net