هو تعميم لفكرة الـ 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
وضح ذلك باألمثلة