استخدام تعدد الأشكال
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 47 من 61.
التحدي
سهللنثبت أن تعدد الأشكال يعمل حقًا، سنكتب 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 المناسب، ثم مرّر مؤشرًا إلى memberShapeالمضمّن فيه إلى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;
}
جميع دروس البرمجة كائنية التوجه
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 عبر الإنترنت