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