مقدمة
في الدرس السابق تعرفنا على الوراثة (Inheritance)، وعرفنا كيف يمكن لفئة أن ترث الخصائص والوظائف من فئة أخرى.
لكن أحيانًا نحتاج إلى جعل الفئات المشتقة تتعامل مع الوظائف الموروثة بطريقة مختلفة.
وهنا يظهر مفهوم مهم في البرمجة كائنية التوجه يسمى تعدد الأشكال (Polymorphism).
---
ما هو تعدد الأشكال؟
تعدد الأشكال يعني أن العملية أو الوظيفة نفسها يمكن أن يكون لها سلوك مختلف حسب الكائن الذي يستخدمها.
وبذلك يمكن استخدام واجهة مشتركة للتعامل مع أنواع مختلفة من الكائنات.
---
لماذا نستخدم تعدد الأشكال؟
يساعد تعدد الأشكال على كتابة كود أكثر مرونة.
فبدلًا من كتابة تعليمات منفصلة لكل نوع من الكائنات، يمكن تصميم البرنامج بطريقة تسمح بالتعامل معها من خلال واجهة مشتركة.
---
إعادة تعريف الدوال (Function Overriding)
من أهم صور تعدد الأشكال إعادة تعريف الدوال.
يمكن للفئة المشتقة أن تقدم تنفيذًا خاصًا لدالة موجودة في الفئة الأساسية.
وبذلك يمكن أن يكون لكل فئة سلوك مختلف مع الاحتفاظ بنفس اسم الدالة.
---
تعدد الأشكال وقت التشغيل
في C++ يمكن استخدام الدوال الافتراضية Virtual Functions لتحقيق تعدد الأشكال أثناء تشغيل البرنامج.
عند التعامل مع الكائن من خلال مؤشر أو مرجع للفئة الأساسية، يمكن تحديد الدالة المناسبة وفقًا لنوع الكائن الفعلي.
---
تعدد الأشكال وقت الترجمة
تدعم C++ أيضًا صورًا من تعدد الأشكال تحدث أثناء الترجمة، مثل تحميل الدوال (Function Overloading).
يمكن إنشاء عدة دوال تحمل الاسم نفسه، لكنها تختلف في أنواع أو عدد المعاملات.
ويحدد المترجم الدالة المناسبة بناءً على طريقة استخدامها.
---
أهمية تعدد الأشكال في OOP
يعد تعدد الأشكال أحد المفاهيم الأساسية في البرمجة كائنية التوجه، إلى جانب:
- التغليف (Encapsulation).
- الوراثة (Inheritance).
- التجريد (Abstraction).
وفهم هذه المفاهيم يساعد على بناء برامج منظمة وقابلة للتوسع.
---
استخدام تعدد الأشكال في مشاريع C++
يستخدم تعدد الأشكال في العديد من التطبيقات، مثل:
- الألعاب.
- البرامج الهندسية.
- التطبيقات المكتبية.
- الأنظمة الإدارية.
- المشاريع البرمجية الكبيرة.
---
فوائد تعدد الأشكال
يوفر تعدد الأشكال العديد من المزايا، منها:
- زيادة مرونة البرنامج.
- تقليل تكرار الكود.
- تسهيل إضافة أنواع جديدة من الكائنات.
- تحسين تنظيم المشاريع.
- تسهيل التعامل مع الفئات المرتبطة ببعضها.
---
أخطاء شائعة عند المبتدئين
من الأخطاء التي يقع فيها المبتدئون:
- الخلط بين Overriding وOverloading.
- استخدام تعدد الأشكال دون فهم الوراثة.
- نسيان استخدام "virtual" عندما تكون مطلوبة لتعدد الأشكال وقت التشغيل.
- عدم فهم الفرق بين المؤشرات والمراجع عند التعامل مع الكائنات.
لذلك من الأفضل فهم الوراثة أولًا قبل التعمق في تعدد الأشكال.
---
ملخص الدرس
تعرفنا في هذا الدرس على تعدد الأشكال (Polymorphism) في C++، وعرفنا كيف يمكن للعملية نفسها أن تتصرف بطرق مختلفة حسب الكائن المستخدم، كما تعرفنا على إعادة تعريف الدوال وتحميل الدوال والدوال الافتراضية.
في الدرس الثلاثون سنتعرف على التجريد (Abstraction)، وسنفهم كيف نخفي التفاصيل غير الضرورية ونركز على الوظائف الأساسية للكائنات.



