هو تعميم لفكرة الـ Struct الموجود في لغة الـ C حيث أن الـ Struct في لغة الـ C كانت تحتوي.

Download Report

Transcript هو تعميم لفكرة الـ Struct الموجود في لغة الـ C حيث أن الـ Struct في لغة الـ C كانت تحتوي.

‫هو تعميم لفكرة الـ ‪ Struct‬الموجود في لغة الـ ‪ C‬حيث أن الـ ‪ Struct‬في لغة الـ ‪ C‬كانت تحتوي على‬
‫‪ data members‬فقط دون أن تحوي على ‪ ، methods‬وعلى الرغم من أن لغة ‪ C++‬تحتوي أيضاً‬
‫على بنية المعطيات ‪ Struct‬إال أنها تختلف هذه األخيرة عن الـ ‪ Classes‬باختالف شكلي بسيط سنتكلم‬
‫عليه الحقاً‪.‬‬
‫الصف هو نمط معطيات مهيكل يتم إنشاءه من قبل المبرمج أي أنه ‪:‬‬
‫‪User-defined (programmer-defined) type‬‬
‫عند تعريف الصف نقوم بوضع ما يسمى ‪ members‬والتي تعبر عن الـ ‪ data‬والـ ‪behaviour‬‬
‫للصف ‪.‬‬
‫الصف هو بنية معطيات مهيكلة تحتوي على ‪ members‬والتي تقسم إلى ‪:‬‬
‫)‪ : Attributes (data members‬وهي المتحوالت واألغراض والمؤشرات وغيرها‪.‬‬
‫)‪ : Behaviour (methods‬وهو مجموعة من التوابع األعضاء في الصف والتي توصف سلوك‬
‫الصف وسوف ندعو هذه التوابع األعضاء بـ ‪. methods‬‬
‫بعد تعريف الصف يتم إنشاء متحول منه ويدعى المتحول عندها بـ ‪ Object‬أو ‪. Instance‬‬
: ‫ من خالل‬OOP ‫ تعتبر تحقيقاً لتقنية الـ‬Classes ‫إن استخدام الصفوف‬
Encapsulation
Compositions & Aggregation
Inheritance
Reusable
OOP (Object Oriented Programming)
‫إن الكلمة المفتاحية ‪ class‬هي كلمة محجوزة في اللغة )تكتب بأحرف صغيرة ( ‪.‬‬
‫بعدها نقوم بكتابة اسم الصف بحيث يكون معبراً عنه ‪.‬‬
‫ثم نقوم بوضع الـ ‪ Class members‬وهي كما ُذكر سابقاً مكونة من ‪ data‬و ‪. methods‬‬
‫نقوم بوضع فاصلة منقوطة بعد االنتهاء من تعريف الصف ‪.‬‬
‫بعد االنتهاء من تعريف الصف ال يتم حجز أي مكان في الذاكرة‪ ،‬وكأنه نمط جديد‬
‫تم تعريفه في اللغة ‪.‬‬
‫تذكر أنه عندما نقوم بتعريف متحول من الصف المعرف مسبقاً فإن هذا المتحول‬
‫يدعى ‪ Object‬أو ‪. Instance‬‬
‫الصف هو بنية معطيات مهيكلة تحتوي على ‪ members‬والتي تقسم إلى‬
‫‪:‬‬
‫)‪ : Attributes (data members‬وهي المتحوالت واألغراض‬
‫والمؤشرات وغيرها‪.‬‬
‫)‪ : Behaviour (methods‬وهو مجموعة من التوابع األعضاء في الصف‬
‫والتي توصف سلوك الصف وسوف ندعو هذه التوابع األعضاء بـ ‪. methods‬‬
‫)‪ : Attributes (data members‬وهي المتحوالت واألغراض والمؤشرات وغيرها‪.‬‬
‫تستخدم لتخزين المعطيات كما كنا نستخدم المتحوالت في تخزين المعطيات‪ ،‬اآلن أصبحت هذه‬
‫المتحوالت مهيكلة ضمن ما يسمى بالصف ‪. Class‬‬
‫ال تحاول إعطاء قيم ابتدائية للـ ‪ data members‬الموجودة ضمن الـصف مباشرة وإن حاولنا‬
‫ذلك فإنه سينتج لدينا ‪. Compiler Error‬‬
‫يوجد تابع سنتعرف عليه بعد قليل هو الذي سيقوم بعملية التهيئة وإعطاء قيمة ابتدائية للـ ‪data‬‬
‫‪ members‬في الصف ويدعى ذلك التابع بالباني ‪. Constructor‬‬
‫)‪ : Behaviour (methods‬وهي التوابع التي توصف سلوك الصف ‪.‬‬
‫تستخدم للتعبير عن سلوك الصف ‪.‬‬
‫تستطيع هذه التوابع رؤية جميع المتحوالت ‪ data members‬المعرفة ضمن نفس‬
‫الصف ‪.‬‬
‫من خالل هذه التوابع يتم التعامل مع الصف‪ ،‬حيث تشكل مجموعة من التوابع واجهة‬
‫المستخدم في التعامل مع الصف ‪.‬‬
‫إن لغات البرمجة اإلجرائية التقليدية )‪ (procedural languages‬مثل الـ ‪ pascal‬تكون‬
‫جميع المتحوالت عامة ‪ public‬أي ال يمكن إخفائها ‪ ،‬في حين أن لغات البرمجة الموجهة الهدف‬
‫‪ OOP‬تستطيع إخفاء متحوالتها لتصبح ‪ ، private‬ويتم ذلك من خالل الصفوف ‪، classes‬‬
‫وهذا ما يسمى بـ ‪. Information Hiding‬‬
‫إن الـ ‪ OOP‬تقدم لنا واجهة ‪ Interface‬للتعامل مع الصف ‪ Class‬من دون معرفة التفاصيل‬
‫الداخلية التي تجري داخل الصف ‪ ،‬فالذي يهم المستخدم في النهاية هو النتيجة وليس كيفية الوصول‬
‫إلى النتيجة ‪.‬‬
‫في لغة الـ ‪ C++‬يتم تصنيف الـ ‪ class members‬إلى ثالث أصناف وهي ‪:‬‬
‫‪: Private (1‬‬
‫وهو النمط االفتراضي أي إذا لم نذكر الـ ‪ Access modifier‬للـ ‪ member‬في‬
‫الصف فيتم وضعه افتراضياً على أنه ‪. private‬‬
‫يتم رؤيته فقط من داخل الصف ومن األصدقاء ‪. friends‬‬
‫‪ : Public (2‬تتم رؤيته من داخل الصف ومن األصدقاء ومن أي مكان تتم رؤية الغرض ‪.‬‬
‫‪ : Protected (3‬تتم رؤيته من داخل الصف ومن األصدقاء ومن الصفوف األبناء ‪.‬‬
‫في لغة الـ ‪ C++‬يتم تصنيف الـ ‪ class members‬إلى ثالث أصناف وهي‬
‫‪:‬‬
‫‪.Private (1‬‬
‫‪.Public (2‬‬
‫‪.Protected (3‬‬
‫وهذه الكلمات الثالث السابقة هي كلمات معرفة مسبقاً في اللغة ‪.‬‬
‫ال يمكن الوصول إلى الـ ‪ private member‬من خارج الصف‪.‬‬
‫يمكن الوصول إلى الـ ‪ public member‬من خارج الصف ‪.‬‬
‫إن الـ ‪ private member‬يبق مخفي للمستخدم ‪ client‬الذي سوف يستخدم‬
‫هذا الصف‪.‬‬
‫إذاً كيف سيتعامل هذا المستخدم مع هذه المتحوالت المخفية الخاصة ؟؟‬
‫عن طريق توابع ‪ methods‬الـ ‪ Access Modifiers‬لها هو ‪. public‬‬
‫إن الشكل التالي يمثل غرض من الصف ‪Time‬‬
‫أي ‪.Instance of Time Class‬‬
‫يمكن للـ ‪ client‬التعامل مع الغرض عن طريق‬
‫التوابع الموجودة في الصف والمعرفة على أنها‬
‫‪. public‬‬
‫ال يمكن للـ ‪ client‬أن يصل إلى الـ‬
‫‪. private data or private methods‬‬
‫التابع السابق يدعى بالباني في الصف ‪ Constructor‬وفيه نقوم بإعطاء القيم‬
‫االبتدائية للـ ‪. data members‬‬
‫اسمه نفس اسم الصف ‪.‬‬
‫ال يرد شي ‪ ،‬أي ليس له ‪. return type‬‬
‫يستدعى ضمنياً عند إنشاء الغرض ‪.‬‬
‫التابع السابق هو ‪ method‬ضمن الصف ‪ Time‬والذي يقوم بضبط قيم‬
‫الساعة وفق لشروط ‪ ،‬والذي يقوم بإسناد قيمة معينة في حال تم إدخال قيم‬
‫خاطئة ‪ ،‬وهذه إحدى الفوائد التي تكمن خلف الـ ‪. Information Hiding‬‬
‫بعد االنتهاء من تعريف الصف يمكننا إنشاء غرض أو مؤشر أو‬
‫مصفوفة أو مرجعية ‪ ،‬الحظ التعريفات التالية ‪:‬‬
‫يتم تعريف الغرض في الـ ‪ main function‬أو في صف آخر ‪.‬‬
‫إذا كنا ضمن نطاق الصف ‪ class scope‬فإنه يمكننا الوصول إلى المتحوالت والتوابع‬
‫مهما كان الـ ‪ access modifier‬لها ‪ ،‬وذلك فقط بمجرد ذكر اسم المتحول ‪ ،‬الحظ التالي‬
‫‪:‬‬
‫عندما نقوم بتعريف غرض من الصف ‪ ،‬فإنه يمكننا الوصول إلى الـ ‪ public members‬فقط‬
‫عن طريق استخدام النقطة بعد اسم الغرض أو استخدام >‪ -‬بعد اسم المؤشر ‪.‬‬
‫هل يمكن تعريف متحول ضمن ‪ method‬في صف يحوي هذا األخير متحول بنفس االسم ؟‬
‫من المثال السابق نالحظ أنه ال يمكننا الوصول إلى الـ ‪. private data‬‬
‫يمكننا التحكم بالـ ‪ private data‬عن طريق ‪ access methods‬وهي نوعين ‪:‬‬
‫‪Set Methods‬‬
‫‪Get Methods‬‬
‫إن منهجيات الـ ‪ set‬و ‪ get‬هي وسائل مساعدة تمكننا من‬
‫الوصول إلى الـ ‪private data‬‬
‫يمكننا التحكم بالـ ‪ private data‬عن طريق ‪ access methods‬وهي نوعين ‪:‬‬
‫‪: Set Methods‬‬
‫وفيها يتم تعديل قيم المتحوالت الـ ‪. private‬‬
‫يتم فيها التحقق من صحة البيانات المدخلة ‪ check validity‬فمثالً إذا كان لدينا ‪set‬‬
‫‪ method‬لتعديل نصف قطر دائرة فيجب مراعاة في حال تم إدخال قيمة سالبة ‪ ،‬وفي‬
‫حال تم ذلك ينبغي إظهار رسالة للمستخدم بأنه قام بإدخال قيمة خاطئة ‪.‬‬
‫ال يرد شي أي ‪. return type is void‬‬
‫يمكننا التحكم بالـ ‪ private data‬عن طريق ‪ access methods‬وهي‬
‫نوعين ‪:‬‬
‫‪: Get Methods‬‬
‫وفيها يتم قراءة قيم المتحوالت الـ ‪. private‬‬
‫يرد متحول من النمط المعاد أي أن له ‪. return type‬‬
‫هل من الممكن لـ ‪ private method‬أن يصل إلى ‪ private data‬في نفس الصف ‪.‬‬
‫هل من الممكن لـ ‪ private method‬أن يصل إلى ‪ private method‬في نفس الصف ‪.‬‬
‫هل من الممكن لـ ‪ private method‬أن يصل إلى ‪ public data‬في نفس الصف ‪.‬‬
‫هل من الممكن لـ ‪ private method‬أن يصل إلى ‪ public method‬في نفس الصف ‪.‬‬
‫أعد نفس األسئلة بالنسبة للـ ‪ public method‬وبالنسبة للـ ‪. protected method‬‬
‫طالما نحن في نفس الصف فإننا نملك أعلى إمكانية للوصول أي‬
‫كل ما سبق هو صحيح‬
‫يمكن تقسيم الـ ‪ code‬في الصف إلى ملفين إحداهما بالالحقة ‪ .h‬واآلخر بالالحقة ‪.cpp‬‬
‫الملف األول ذو الالحقة ‪ .h‬هو ملف ‪ header‬نضع فيه الصف دون كتابة الـ ‪ Body‬للـ‬
‫‪. methods‬‬
‫الملف الثاني ذو الالحقة ‪ .cpp‬هو ملف ‪ source file‬نضع فيه الـ ‪ Body‬للـ ‪. methods‬‬
‫وعن طريق هذه العملية يتم فصل الواجهة عن التنفيذ ‪.‬‬
‫لماذا نقوم بذلك ؟؟‬
‫الـ ‪ client‬ليس مهتم بالتفاصيل التي تجري داخل الـ ‪ code‬والذي يهمه فقط هو الواجهة‬
‫‪ interface‬أي الـ ‪ public methods‬دون أن يهتم بكيفية عمل هذه الـ ‪.methods‬‬
‫تؤمن هذه العملية فصل الواجهة عن التنفيذ مما يسهل عملية التعديل على الكود البرمجي ‪.‬‬
‫الذي يؤمن الواجهة هو الـ ‪ public methods‬والتي تتم رؤيتها دون أن تتم رؤية الـ ‪private‬‬
‫‪ data‬والـ ‪ implementation‬وهذا يحقق الـ ‪. Information Hiding‬‬
‫نقوم بإنشاء ملف ‪header‬‬
‫باالسم ‪ Circle.h‬ونكتب فيه‬
‫الكود التالي وهو يعبر عن‬
‫هيكل الصف دون أن نكتب‬
‫فيه كود برمجي أي ال يوجد‬
‫‪. bodies‬‬
‫نقوم بإنشاء ملف ‪source file‬‬
‫باالسم ‪ Circle.cpp‬ونكتب فيه‬
‫الكود التالي وهو يعبر عن تنفيذ‬
‫الصف‬
‫والذي‬
‫يدعى‬
‫بـ‬
‫‪. implementation‬‬
‫في البداية نقوم بتضمين المكتبة‬
‫المنشئة مسبقاً ‪. Circle.h‬‬
‫حان اآلن وقت االستدعاء في الـ ‪. main function‬‬
‫ولكن هنا يجب أيضاً تضمين الـ ‪ header file‬في البداية ‪.‬‬
‫الحظ كيف أن الكود أصبح أكثر تنظيماً ‪.‬‬
‫اتبع هذا األسلوب في البرامج التي تحوي أكثر من صف‪.‬‬
‫‪ Homework ‬‬
‫ما هو الفرق بين الـ ‪ Struct‬والـ ‪ Class‬في‬
‫‪C++ Language‬‬
‫وضح ذلك باألمثلة‬