Menu
Coddy logo textTech

מתודות הרחבה

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

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

כדי ליצור מתודת הרחבה, הגדירו מתודה סטטית במחלקה סטטית, כשהפרמטר הראשון שלה מופיע אחרי מילת המפתח this:

public static class StringExtensions
{
    public static int WordCount(this string str)
    {
        return str.Split(' ').Length;
    }
}

כעת אפשר לקרוא למתודה הזאת ישירות על כל מחרוזת:

string sentence = "Hello World Today";
int count = sentence.WordCount();  // 3

הפרמטר this string str אומר למהדר שהמתודה הזו מרחיבה את הטיפוס string. כשקוראים ל־sentence.WordCount(), המהדר מתרגם זאת מאחורי הקלעים ל־StringExtensions.WordCount(sentence).

שיטות הרחבה יכולות לקבל גם פרמטרים נוספים:

public static bool IsLongerThan(this string str, int length)
{
    return str.Length > length;
}

// שימוש
bool result = "Hello".IsLongerThan(3);  // true

הטכניקה הזו נמצאת בשימוש נרחב ב-LINQ, שבו מתודות כמו Where() ו-Select() הן מתודות הרחבה עבור IEnumerable. מתודות הרחבה הן כלי רב עוצמה להוספת פונקציות שימושיות לטיפוסים שאינם בשליטתך, תוך שמירה על קוד נקי ומובן.

challenge icon

אתגר

קל

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

תארגן את הקוד שלך בשני קבצים:

  • IntExtensions.cs: צור מחלקה סטטית בשם IntExtensions במרחב השמות Utilities. המחלקה תכיל שיטות הרחבה שמשפרות את הטיפוס int:
    • IsEven() - מחזירה true אם המספר זוגי, ו-false אחרת
    • Square() - מחזירה את המספר כפול עצמו
    • IsInRange(int min, int max) - מחזירה true אם המספר נמצא בין min ל-max (כולל), ו-false אחרת
    זכור ששיטות הרחבה חייבות להיות שיטות סטטיות במחלקה סטטית, כאשר הפרמטר הראשון משתמש במילת המפתח this כדי לציין איזה טיפוס את/ה מרחיב/ה.
  • Program.cs: בקובץ הראשי שלך, קרא מספר שלם מהקלט והדגם את כל שלוש שיטות ההרחבה. קרא לכל שיטה ישירות על המספר השלם כאילו הייתה שיטה מובנית, ואז הדפס את התוצאות.

יתקבלו שלושה קלטים:

  • מספר לבדיקה (מספר שלם)
  • ערך מינימלי לבדיקת טווח (מספר שלם)
  • ערך מקסימלי לבדיקת טווח (מספר שלם)

הדפס את הפלט בפורמט הזה:

Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}

לדוגמה, אם הקלטים הם 7, 5 ו-10, הפלט אמור להיות:

Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? True

שים לב כמה טבעי לכתוב number.IsEven() ו-number.Square() - שיטות ההרחבה מרגישות כאילו תמיד היו חלק מהטיפוס של מספרים שלמים!

נסו בעצמכם

using System;
using Utilities;

class Program
{
    public static void Main(string[] args)
    {
        // קראו את הקלטים
        int number = Convert.ToInt32(Console.ReadLine());
        int min = Convert.ToInt32(Console.ReadLine());
        int max = Convert.ToInt32(Console.ReadLine());

        // TODO: השתמשו במתודות ההרחבה של 'number' והדפיסו את התוצאות
        // קראו ל־number.IsEven(), ל־number.Square() ול־number.IsInRange(min, max)
        // הדפיסו בפורמט הבא:
        // האם {number} זוגי? {True/False}
        // הריבוע של {number}: {result}
        // האם {number} בטווח [{min}-{max}]? {True/False}

    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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