مراجعة: هرمية الأشكال
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 32 من 61.
التحدي
سهللنبنِ تسلسلاً هرمياً كاملاً للأشكال يوضّح قوة الوراثة عبر التركيب. ستنشئ نوع Shape أساسياً يمكن لأي شكل محدد أن يرث منه، ثم ستبني Rect الذي يوسّعه.
ستنظّم الشيفرة عبر ثلاثة ملفات:
shape.h: Define التسلسل الهرمي لـ struct مع حواجز include. Create struct من النوعShapeيحتوي على حقلcolorواحد (عدد صحيح). ثم Define struct من النوعRectالذي embedsShapeباعتباره أول member له، ويضيف حقليwidthوheight(كلاهما عددان صحيحان). Declare دالتين:set_colorالتي takes مؤشراً من النوعShape*وقيمة color جديدة، وprint_rectالتي takes مؤشراً من النوعRect*.shape.c: Implement كلتا الدالتين. تعمل functionset_colorالخاصة بك مع النوع الأساسي. وهي تعدّل color لأي شكل. تعرض functionprint_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;
}
جميع دروس البرمجة كائنية التوجه
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت