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

مراجعة: هرمية الأشكال

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

challenge icon

التحدي

سهل

لنقم ببناء هيكل هرمي كامل للأشكال يوضح قوة الوراثة عبر التركيب (composition). ستقوم بإنشاء نوع أساسي Shape يمكن لأي شكل محدد أن يرث منه، ثم بناء Rect يمتد منه.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • shape.h: قم بتعريف هيكل الـ structs الخاص بك مع استخدام حارسات التضمين (include guards). أنشئ struct باسم Shape يحتوي على حقل color واحد (عدد صحيح). ثم قم بتعريف struct باسم Rect يدمج Shape كأول عضو فيه ويضيف حقلي width و height (كلاهما أعداد صحيحة). قم بالتصريح عن دالتين: set_color التي تأخذ Shape* وقيمة لون جديدة، و print_rect التي تأخذ Rect*.
  • shape.c: قم بتنفيذ كلتا الدالتين. تعمل دالة set_color مع النوع الأساسي — فهي تعدل لون أي شكل. أما دالة print_rect فتعرض جميع معلومات المستطيل بما في ذلك لونه الموروث.
  • main.c: أنشئ Rect وقم بتهيئة جميع حقوله. ثم وضح عملية الـ upcasting من خلال استدعاء set_color مع تحويل المستطيل الخاص بك إلى Shape*. أخيرًا، قم بطباعة المستطيل للتحقق من تغيير اللون من خلال مؤشر النوع الأساسي.

ستتلقى أربعة مدخلات: width (عرض) المستطيل، و height (ارتفاعه)، و initial color (اللون الأولي)، و new color (اللون الجديد) لتعيينه عبر الدالة العامة.

في ملفك الرئيسي، أنشئ المستطيل بالقيم الأولية، ثم استخدم set_color لتغيير لونه إلى القيمة الجديدة (تذكر تحويل Rect* إلى Shape*)، وأخيرًا استدعِ print_rect لعرض النتيجة.

يجب أن يبدو مخرجك كما يلي:

Width: 10
Height: 5
Color: 7

حيث 10 هو العرض، و 5 هو الارتفاع، و 7 هو اللون المحدث (وليس اللون الأولي). الفكرة الجوهرية هنا هي أن set_color لا تعرف شيئاً عن المستطيلات — فهي تعمل فقط مع Shape. ومع ذلك، من خلال قاعدة العضو الأول والـ upcasting، يتم تعديل لون المستطيل الخاص بك من خلال هذه الدالة العامة.

جرّب بنفسك

#include <stdio.h>
#include "shape.h"

int main() {
    int width, height, initial_color, new_color;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &initial_color);
    scanf("%d", &new_color);
    
    // TODO: قم بإنشاء Rect وتهيئة جميع حقوله
    // (العرض، الارتفاع، ولون الـ Shape المضمن بـ initial_color)
    
    // TODO: قم باستدعاء set_color مع تحويل المستطيل إلى *Shape
    // لتغيير اللون إلى new_color
    
    // TODO: قم باستدعاء print_rect لعرض النتيجة
    
    return 0;
}

جميع دروس Object Oriented Programming