الكائنات
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
مرحبا بكم في الدرس السادس من دروس جافا لموقع الألعاب العربية. كما هي العادة سأفترض انك قرأت الدروس السابقة، في هذا الدرس سوف .... أولا ستحتاج لكوب من العصير امامك وذلك حتى تستطيع ان تستوعبه جيدا... بعد ذلك بعض الهدوء. وهذا كل ما ستحتاجة لمتابعة هذا الدرس معاً. في هذا الدرس سوف نتعرف على "الكائـنات" لأننا تكلمنا عنها كثيرا في الدروس السابقة ولأهميتها في لغة جافا. وقد استخدمناها في كل درس من الدروس السابقة تقريبا وشرحناها بشكل بسيط وسريع. ولكن ذلك لا يكفي لكي نستطيع فعلا الإستفاده منها. في هذا الدرس سننظر إليها بشيء من التركيز.
ربما سمعت كثير عن اللغات الكائينة ! مثل لغة C++ ولغة جافا ، وسميت ذلك لأهمية الكائنات وما تعنية بالنسبة لهذه اللغات. قبل ان نتعمق اكثر في هذا الدرس اريد ان أوأكد انه سهل جدا وسوف تتعرف عليه مع كل كلمة أكتبها. بعد ان رفعت معنوياتك قليلا سوف نبدا في الحديث عن معنى "الكائن". الكائن بكل بساطة يقصد به جزء من الشفرة البرمجية ، ولكن لها مميزات معينة تجعلها مهمة. الكائن هو عبارة عن برنامج بحد ذاته. ونستطيع استخدامه مرار مع اكثر من شفرة برمجية. مثلا على فرض انك برمجت برنامج يقوم بحساب مجموع رقيمن وجعلته في كائن ، ثم استخدمت هذا الكائن في ذلك البرنامج. بعد فترة قررت كتابه برنامج آخر لآله حاسبه ، فبدل ان تنشيء كائن جديد مسؤول عن عملية الجمع فإنك ستستخدم نفس الكائن السابق وتعيد استخدامه في هذا البرنامج الجديد.
لماذا الكائنات مهمة جدا ؟
هناك الكثير من الأسباب ، دعني اعطيك بعضاها : 1- قدرتك على معرفة مكان الخطء بسهولة اذا حصل 2- القدرة على تتطوير البرنامج بسهولة مع الوقت 3- القدرة على اعادة استخدام الكثير من اجزاء البرنامج لتطوير برامج أخرى 4- عدم الحاجة لإعادة كتابة الشفرة البرمجية عند كل اصدار جديد للبرنامج 5- سهولة تحويل الشفرة البرمجية للغة مختلفه 6- القدرة على توزيع العمل في برنامج واحد ضخم على اكثر من مبرمج بسهولة ويسر.
هذه طبعا مجرد نموذج بسيط من الأسباب الكثيرة التي تجعلنا لا نستغني عن استخدام الكائنات ، وربما وجود الكائنات في بعض اللغات جعلها الأفظل والأكثر استخداما عن اللغات الأخرى التي لا تستخدمها.
لماذا اللف والدوران ، ادخل في صلب الموضوع !!!
حسنا ، يكفي من المقبلات ودعنا ندخل معا لصلب الموضوع ، سنحاول كتابة كائن بسيط يقوم بعمل بسيط جدا. ولكن قبل ان نبدأ سوف نفترض انك قررت كتابة برنامج لشركة انت قمت بإنشائها ، وحتى توفر الكثير من المصاريف الإضافية قررت كتابة البرنامج بنفسك. هذا البرنامج يقوم بتخزين بعض المعلومات عن كل عامل في الشركة.
بستخدام الكائنات المسألة غاية في السهولة كما سوف نرى:
نعم هذا هو الكائن ، بسيط اليس كذلك ، كل ما في الأمر اننا استخدمنا الكلمة "class" لنعبر للغة الجافا عن ان هذا هو كائن ، والذي يليله هو اسم الكائن وقد استخدمنا الأسم "worker" في هذا المثال. وبداخلة استخدمنا متغير واحد فقط يحمل الأسم.
لا لا ليس معقول ان يكون الكائن بهذه السهولة ؟
قد لا تصدق ان الكائن الذي كتبناه هو كائن بكل ما تعنية الكلمة من معنى ، وذلك لشهرة استخدام الكائنات. الشيء الذي لم نذكره هو ان الكائن يملك الكثير من المميزات والتي سنحاول الإطلاع عليها في هذا الدرس. ولأنني في المثال الأول رأيت بأن النظر لكل تلك المميزات من الوهلة الأولى شيء غير مستحب احببت ان اعطيك ابسط شكل للكائن. وبدون اي اضافات فإن هذا الكائن الذي كتبناه سوف يعمل في برنامجك ويعطيك النتيجة التي ترجوها.
في هذه الحالة اريد ان ارى هذا الكائن عملياً !
حسنا لنقم بإنشاء مشروع حتى نستطي ان نضع كائننا هذا في عملة. ولكي نضع السهولة قدر الإمكان فإننا سنستخدم مشروع الدرس الثاني ثم نكتب هذا الكائن في ملف منفصل ونخزنه بالإسم "worker.java" ولا ننسى ان نظيفة للمشروع طبعا. (لمعلومات إضافية راجع الدروس السابقة في كيفية انشاء المشاريع وإضافة الملفات لها)
برنامج الدرس الثاني
في برنامج الدرس الثاني سوف نقوم ببعض التغييرات حتى نستفيد من الكائن الذي كتبناه مسبقا ونقوم :
1- أولا بإنشاء "مؤشر" للكائن كما يلي :
worker info = new worker();
أطلقنا على المؤشر الأسم "info" ، واصبح هذا المؤشر هو ممثل الكائن وعن طريقة نستطيع ان نستفيد من كل مميزات ذلك الكائن(في هذه النقطة سيقوم الكائن بإستدعاء وظيفة الباني إن وجدت وبشكل تلقائي والتي سنطلع عليها بعد قليل). 2- ثانيا بما اننا نستطيع الآن ان نتحكم بمميزات هذا الكائن فإننا سوف نقوم بإعطاء المتغير "name" قيمة معينة وهي اسم العامل :
info.name= "ArabGames";
3- وأخيرا سوف نقوم بستخدام الكائن لعرض هذا الأسم بدل العبارة "Hello world" كما يلي : g.drawString(info.name, 50, 25);
لنرى البرنامج كاملا مرة آخرى :
هذا كل ما في الأمر ، تستطيع الآن ان تجرب البرنامج وسوف ترى الأسم "ArabGames" على الشاشة.
الآن وقد استخدمنا كائن بسيط "worker" ويحوي على متغير واحد فقط “String name" اصبحنا نعلم ان بإستطاعتنا إضافة المتغيرات المختلفة للكائن ، ولكن هل نستطيع ان نضيف وظائف معينة للكائن. والجواب هو نعم ، لانك عزيزي القاريء لو كنت متابع معنا الدروس السابقة فأنت بالفعل قد قمت بإنشاء الكائنات ووظائفها.
مثلا في الدرس السابق "الخامس" قمت بإنشاء عدة وظائف وتلك والوظائف كانت جزء من الكائن HelloWorld. فأنت مع انك تقراء هذا الدرس على انه جديد إلا انك قد سبق لك وأنشأت الكائنات وأنشأت وظائفها. نحن منذ الدرس الأول نشرح ما يعنية الكائن ، صحيح اننا لم تجعل ذلك صريحا ولكن لم يكن الوقت اللأئق له. أما الآن وانت تقراء عن عمل الكائنات فأنا سعيد ان اقول لك بأنك كنت تتعامل معها وتنشئها كل ذلك الوقت من الدرس الأول وحتى هذا الدرس.
ولكن لنقم بتضويح هذه العملية أكثر ، يجب أولا معرفة أن كل كائن يحتوي على بعض الوظائف الخاصة. بالتحديد وظيفيتين يحملان نفس أسم الكائن ، الأولى يطلق عليها وظيفة الباني وننشإها كما يلي (سوف نكتب الكائن كاملا بما في ذلك الوظيفة):
كما ترى اننا كتبنا الوظيفة بنفس الطريق التي تعودنا عليها في الدروس السابقة ، ولكن ما هو الخاص في هذه الوظيفة ؟ في الحقيقة لو نظرت إلى اسم الوظيفة "worker" لوجدته مطابق لإسم الكائن ، ولهذا يطلق على هذه الوظيفة وظيفة "الباني" وعندما يرى الكائن ان هناك وظيفة بداخلة تحمل نفس اسمة فأنه يقوم بإستدعائها تلقائيا حالما يتم انشائة. إذاً خاصية هذه الوظيفة انها تُستدعَى تلقائيا حالما نُنشيء ممثل لهذا الكائن ، في حالتنا هذه فإنها ستقوم بوضع القيمة "My name is" بداخل المتغير name. ربما انك تسأل نفسك الآن ، ولكن ماذا يهمني ذلك ؟ سؤال جيد لأن إجابته هي سبب وجود هذه الوظيفة الخاصة في الكائنات. والجواب هو ان بإستطاعتك عند إنشاء الكائنات إجبارها على القيام بعمليات معينة تلقائيا ، مثل حجزء جزء من الذاكرة ، أو كما فعلنا في مثالنا هذا القيام بإعطاء قيم معينة للمتغيرات وهكذا.
لو أنك قمت بالتغيير السابق وشغلت البرنامج فإنك لن ترى اي تغيير على الشاشة لماذا ؟ لأننا في الخطوة 2 في الوظيفة الرئيسية أعطينا المتغير “name" القيمة "ِArabGames" والتي قامت بإزالة القيمة التلقائية الموجودة به ، ولتصليح هذه المشكله كل ما عليك عملة هو وضع التعبير "=+" لأنك هنا تقول للكمبيوتر أضف هذه القيمة للقيمة السابقة بدل التعبير السابق "=" والذي يقول للكمبيوتر أضف هذه القيمة للمتغير مع مسح مابه سابقا (لمعلومات اكثر عن التعابير راجع الدرس الرابع) كما يلي:
info.name+= "ArabGames";
الآن انت جاهز لإنتاج وتشغيل البرنامج وسوف ترى العبارة التالية على الشاشة:
My name is ArabGames
الثانية هي وظيفة "المدمر" وهي بالضبط تقوم بعكس عمل وظيفة "الباني". وخاصية هذه الوظيفة ان الكائن يقوم بإستدعائها عند القيام بإزالة المؤشر من الذاكرة. ولكن لنتوقف هنا للحظة !! نحن ذكرنا في ملاحظة سابقة عند بداية هذا الدرس أن لغة جافا تختلف عن لغة C++ في أنك لا تحتاج للقلق بشأن إزالة المؤشر من الذاكرة، لأنها تحتوي على مايسمى "بجامع المهملات". ويقصد بالمهملات كل مؤشر للذاكرة لم يعد قيد الإستخدام فيقوم "جامع المهملات" بإزالته بشكل تلقائي. ولهذا السبب فإنه لا يوجد داعي لوظيفة المدمر في لغة جافا ، هذه معلومة مهمة جدا لأن وجود "جامع المهملات" جعل من لغة جافا أفظل بكثير عن لغة C++. فلو أننا حجزنا جزء من الذاكرة في وظيفة الباني فليس هناك داعي للقلق بشأن تحريرها في وظيفة المدمر كما كنا نفعل في لغة الـC++ والتي كانت تسبب الكثير من الصعوبات.
بقية انواع الوظائف الممكن استخدامها في الكائنات تشمل ما تحدثنا عنه في الدرس الخامس.
ملاحظة: مع انك في لغة جافا لا تحتاج للقلق بشأن إزالة اي مؤشر للكائن من الذاكرة تستطيع ان تجبر لغة جافا على ازالته متى احببت عن طريق وضع قيمته تساوي nullمثلا في مثالنا في هذا عند انتهائك من الكائن تستطيع وضعه كما يلي:
info=null;في لــغة الـجافا
في لغة الـ C++ delete(info);
سبق وتعرفنا على المتغيرات في الدرس الرابع ، بالنسبة للكائنات فإنها تستخدم جميع انواع المتغيرات ولكن هناك إضافة بسيطة لها ، وهو تقسيمها لثلاث انواع (في الحقيقة هذه الأقسام تشمل كذلك الكائن نفسه والوظائف التي يستخدمها بالإضافة طبعا للمتغيرات) :
1) النوع الأول يطلق علية النوع العام ونستخدم التعبير public وعندما نضع متغير (أو وظيفة) بهذا القسم فإنه يصبح في متناولنا عن طريق الممثل لهذا الكائن. لو نظرت إلى مثالنا هذا لوجدت اننا لم نستخدم اي قسم للتعبير عن المتغير nameأو الوظيفة workerوهذا يعني انها public وبالتالي الكمبيوتر سيتعامل معها كذلك. وفي الحقيقة مع ان ما فعلناه سوف يعمل بدون أية اخطاء فإن عدم تحديد القسم هو عادة سيئة ولذلك وبقصد التسهيل فقط كتبتها كما سبق وكان يجب ان يكون شكلها كالتالي:
ونحن في الكائن الرئيسي قمنا بإعطاء المتغير name القيمة "ArabGames" وتمكنا من ذلك لأنه يتبع للقسم public.
2) النوع الثاني يطلق علية النوع الخاص ونستخدم التعبير private وعندما نضع متغير (أو وظيفة) بهذا القسم فإنه يصبح في متناولنا فقط في داخل وظائف هذا الكائن ولا يمكن استخدامه عن طريق الممثلين له كما فعلنا مع القسم 1.
3) النوع الثالث يطلق علية النوع المحمي ونستخدم التعبير protected وهو مشابه للنوع الثاني مع اختلاف بسيط ، هو انك تستطيع استخدامه مع الكائنات التي ترث هذا الكائن. طبعا انا اشعر الآن أن علامة استفهام كبيرة مرتسمه على وجهك!!! ماذا نقصد بالكائن الوارث ؟ مع انك تسمع هذا التعبير لأول مرة في هذا الدرس ولكننا نحن طوال الوقت نستخدم كائنات وارثة. لو راجعت جميع الدروس السابقة سترى العبارة "extends" عند انشاء الكائن الرئيسي وتعني ان هذا الكائن وارث للحزمة الفلانية (والتي هي في الأصل مجموعة كائنات).
قال لي صديق "هل تملك سيارة ؟" قلت له نعم ، انا بذلك جاوبت على سؤالة وبكل دقة. بعد لحظات سألني "ما هو نوع تلك السيارة ؟" فقلت له السيارة كذا ذات الصنع كذا من الشركة كذا ، وأنا بذلك اجبته على سؤالة الأكثر تفصيلا من الأول وبشكل دقيق أيظا ، ثم بعد لحظات قال لي "ما هي موصفات هذه السيارة ؟" فأجبته ان لونها كذا وسرعتها كذا ونظام الآمان فيها كذا ...الخ كان صديقي في البداية يريد معرفة إذا كانت عندي سيارة أم لا وكانت اجابة ذلك السؤال تكفيه لمعرفة انني استطيع التنقل بستخدام سيارتي تلك وكان ذلك الجواب ايظا يكيفية لمعرفة انني اتمتع بمميزات كل شخص يملك سيارة ، ولكنه اصر على معرفة تفاصيل اكثر. في مثالنا هذا قد قمنا بإنشاء كائن كامل ونظرنا لأهم مميزاته ونستطيع ان نبدأ استخدامه في برامجنا ولكن ذلك لا يعني ان ما ذكرناه في هذا الدرس يشمل كل تفاصيل الكائنات في لغة الجافا. مثل صديقي ، اراد ان يعرف تفاصيل اكثر عن السيارة ، لانه يعرف ان هناك تفاصيل اكثر قد تهمه هو. ولهذا السبب سوف نكتفي بما عرفناه في هذا الدرس عن الكائنات ولكن ذلك لا يعني اننا شملنا كل صغيرة وكبيرة بها ولكن نظرنا إلى اهم مانريده في هذه النقطة من دروس جافا.
|
|
©جميع حقوق الطبع والنشر محفوضه لموقع انترنت كلنك 2000-2001 |
. copyright © 2000 internet clinic. All rights reserved |
If you have any remarks, please email to web_clinic@hotmail.comاذا كان لديك أي ملاحظة الرجاء الكتابة |