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

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

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 47 من 61.

challenge icon

التحدي

سهل

لنثبت أن تعدد الأشكال يعمل حقًا، سنكتب function يمكنها معالجة any shape من خلال مؤشر Shape* الأساسي، سواء كان Circle أو Rectangle.

بالاعتماد على تطبيقي Circle وRectangle الموجودين لديك، ستضيف تجريدًا قويًا: function واحدة تعمل مع أي نوع من shape بطريقة موحّدة.

سيشمل مشروعك الملفات التالية:

  • shape.h: واجهة Shape الأساسية لديك، مع نوعَي DrawFunc وAreaFunc.
  • circle.h وcircle.c: تطبيق Circle من الدرس السابق.
  • rectangle.h وrectangle.c: تطبيق Rectangle من الدرس السابق.
  • shape.c: طبّق function جديدة باسم process_shape تأخذ مؤشرًا من نوع Shape*. يجب أن تستدعي هذه function دالة draw الخاصة بـ shape، ثم تستدعي دالة area الخاصة بها وتطبع result بمنزلتين عشريتين بالتنسيق Area: X.XX.
  • main.c: اعرض تعدد الأشكال أثناء العمل. اقرأ مؤشر نوع shape (c للدائرة وr للمستطيل)، متبوعًا بالأبعاد اللازمة. أنشئ shape المناسب، ثم مرّر مؤشرًا إلى member Shape المضمّن فيه إلى process_shape. تتعامل function نفسها مع كلا النوعين!

سيستقبل برنامجك أحد الخيارين التاليين:

  • 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. ومن خلال تحويل member Shape المضمّن في shape المحدد إلى Shape*، يمكنك تمرير أي نوع من shape إلى هذه function الواحدة. هذا هو تعدد الأشكال: function واحدة وسلوكيات متعددة بناءً على نوع الكائن الفعلي.

تذكّر أن تعلن عن 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 مع base الخاص به
    // TODO: إذا كان 'r'، اقرأ العرض والارتفاع، أنشئ Rectangle، واستدعِ process_shape مع base الخاص به
    return 0;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت