مراجعة: هرمية الأشكال
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 32 من 61.
التحدي
سهللنقم ببناء هيكل هرمي كامل للأشكال يوضح قوة الوراثة عبر التركيب (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
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة