Menu
Coddy logo textTech

שימוש פולימורפי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 47 מתוך 61.

challenge icon

אתגר

קל

בואו נוכיח שפולימורפיזם באמת עובד, באמצעות כתיבת פונקציה שיכולה לעבד כל צורה דרך המצביע הבסיסי Shape*, בין אם מדובר בעיגול ובין אם במלבן.

בהתבסס על המימושים הקיימים שלך של Circle ו-Rectangle, תוסיף הפשטה עוצמתית: פונקציה יחידה שעובדת באופן אחיד עם כל סוג של צורה.

הפרויקט שלך יכלול את הקבצים האלה:

  • shape.h: ממשק הבסיס שלך Shape עם הטיפוסים DrawFunc ו-AreaFunc.
  • circle.h ו-circle.c: המימוש שלך של Circle מהשיעור הקודם.
  • rectangle.h ו-rectangle.c: המימוש שלך של Rectangle מהשיעור הקודם.
  • shape.c: ממש פונקציה חדשה בשם process_shape שמקבלת מצביע Shape*. הפונקציה צריכה לקרוא לפונקציית draw של הצורה, ואז לקרוא לפונקציית area שלה ולהדפיס את התוצאה עם 2 ספרות אחרי הנקודה העשרונית, בפורמט Area: X.XX.
  • main.c: הדגם פולימורפיזם בפעולה. קרא סמן שמציין את סוג הצורה (c לעיגול, r למלבן), ואחריו את המידות הדרושות. צור את הצורה המתאימה, ואז העבר ל-process_shape מצביע לחבר Shape המשובץ בה. אותה פונקציה מטפלת בשני הסוגים!

התוכנית שלך תקבל אחד מהבאים:

  • 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. באמצעות המרה של חבר ה-Shape המשובץ בצורה הקונקרטית שלך למצביע Shape*, אפשר להעביר כל סוג של צורה לפונקציה היחידה הזו. זהו פולימורפיזם: פונקציה אחת, התנהגויות מרובות בהתאם לסוג האובייקט בפועל.

זכור להצהיר על 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 עם הבסיס שלו
    // TODO: אם 'r', קראו את הרוחב והגובה, צרו Rectangle וקראו ל-process_shape עם הבסיס שלו
    return 0;
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין