Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

استخدام تعدد الأشكال

جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 47 من 61.

challenge icon

التحدي

سهل

دعنا نثبت أن تعدد الأشكال (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