استخدام تعدد الأشكال
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 47 من 61.
التحدي
سهلدعنا نثبت أن تعدد الأشكال (polymorphism) يعمل حقاً من خلال كتابة دالة يمكنها معالجة أي شكل عبر مؤشر Shape* الأساسي — سواء كان دائرة (Circle) أو مستطيلاً (Rectangle).
بناءً على تطبيقاتك الحالية لـ Circle و Rectangle، ستضيف تجريداً قوياً: دالة واحدة تعمل مع أي نوع من الأشكال بشكل موحد.
سيتضمن مشروعك هذه الملفات:
shape.h: واجهةShapeالأساسية الخاصة بك مع نوعيDrawFuncوAreaFunc.circle.hوcircle.c: تطبيق Circle الخاص بك من الدرس السابق.rectangle.hوrectangle.c: تطبيق Rectangle الخاص بك من الدرس السابق.shape.c: قم بتنفيذ دالة جديدة تسمىprocess_shapeتأخذ مؤشرShape*. يجب أن تستدعي هذه الدالة دالةdrawالخاصة بالشكل، ثم تستدعي دالةareaالخاصة به وتطبع النتيجة بمنزلتين عشريتين بالتنسيقArea: X.XX.main.c: عرض تعدد الأشكال (polymorphism) قيد التنفيذ. اقرأ مؤشر نوع الشكل (cللدائرة،rللمستطيل) متبوعاً بالأبعاد اللازمة. قم بإنشاء الشكل المناسب، ثم مرر مؤشراً إلى عضوShapeالمضمن فيه إلىprocess_shape. نفس الدالة تتعامل مع كلا النوعين!
سيتلقى برنامجك إما:
cمتبوعاً بقيمة نصف القطر، أوrمتبوعاً بقيم العرض والارتفاع
مثال على المخرجات عندما تكون المدخلات c و 5.0:
Drawing Circle with radius: 5.00
Area: 78.54مثال على المخرجات عندما تكون المدخلات r و 4.0 و 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00السحر هنا هو أن process_shape ليس لديها أدنى فكرة عما إذا كانت تعمل مع Circle أو Rectangle — فهي تعرف فقط واجهة Shape. من خلال تحويل عضو Shape المضمن في شكلك الملموس إلى Shape*، يمكنك تمرير أي نوع شكل إلى هذه الدالة الواحدة. هذا هو تعدد الأشكال (polymorphism): دالة واحدة، وسلوكيات متعددة بناءً على نوع الكائن الفعلي.
تذكر أن تعلن عن process_shape في shape.h حتى يمكن استدعاؤها من main.c.
جرّب بنفسك
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: قراءة حرف لنوع الشكل ('c' للدائرة، 'r' للمستطيل)
// TODO: إذا كان 'c'، اقرأ نصف القطر، أنشئ Circle، واستدعِ process_shape مع قاعدتها
// TODO: إذا كان 'r'، اقرأ العرض والارتفاع، أنشئ Rectangle، واستدعِ process_shape مع قاعدتها
return 0;
}
جميع دروس Object Oriented Programming
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة