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

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

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

challenge icon

التحدي

سهل

لنبنِ تسلسلاً هرمياً كاملاً للأشكال يوضّح قوة الوراثة عبر التركيب. ستنشئ نوع Shape أساسياً يمكن لأي شكل محدد أن يرث منه، ثم ستبني Rect الذي يوسّعه.

ستنظّم الشيفرة عبر ثلاثة ملفات:

  • shape.h: Define التسلسل الهرمي لـ struct مع حواجز include. Create struct من النوع Shape يحتوي على حقل color واحد (عدد صحيح). ثم Define struct من النوع Rect الذي embeds Shape باعتباره أول member له، ويضيف حقلي width وheight (كلاهما عددان صحيحان). Declare دالتين: set_color التي takes مؤشراً من النوع Shape* وقيمة color جديدة، وprint_rect التي takes مؤشراً من النوع Rect*.
  • shape.c: Implement كلتا الدالتين. تعمل function set_color الخاصة بك مع النوع الأساسي. وهي تعدّل color لأي شكل. تعرض function print_rect الخاصة بك all معلومات rectangle، بما في ذلك color الموروث منه.
  • main.c: Create كائناً من النوع Rect وinitialize all حقوله. ثم اعرض عملية الرفع إلى النوع الأساسي باستدعاء set_color مع rectangle الخاص بك بعد cast إلى Shape*. وأخيراً، اطبع rectangle للتحقق من أن color قد تغيّر عبر مؤشر النوع الأساسي.

ستتلقى four مدخلات: width الخاص بـ rectangle، وheight الخاص به، وinitial color، وnew color الذي سيتم تعيينه عبر generic function.

في ملف main الخاص بك، Create rectangle بالقيم الأولية، ثم استخدم set_color لتغيير color الخاص به إلى القيمة الجديدة (تذكّر أن تجري cast لـ Rect* إلى Shape*)، وأخيراً استدعِ print_rect لعرض result.

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

Width: 10
Height: 5
Color: 7

حيث إن 10 هو width، و5 هو height، و7 هو color المحدّث (وليس color الأولي). تتمثل الفكرة الأساسية هنا في أن set_color لا يعرف شيئاً عن rectangles. فهو يعمل فقط مع Shape. ومع ذلك، من خلال قاعدة first member والرفع إلى النوع الأساسي، يتم تعديل color الخاص بـ rectangle عبر هذه generic function.

جرّب بنفسك

#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 وقم بتهيئة جميع حقوله
    // (width، height، ولون الـ Shape المضمّن بـ initial_color)
    
    // TODO: استدعِ set_color مع المستطيل محوّلاً إلى Shape*
    // لتغيير اللون إلى new_color
    
    // TODO: استدعِ print_rect لعرض النتيجة
    
    return 0;
}

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

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