מתודות הרחבה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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. מתודות הרחבה הן כלי רב עוצמה להוספת פונקציות שימושיות לטיפוסים שאינם בשליטתך, תוך שמירה על קוד נקי ומובן.
אתגר
קלבואו נבנה אוסף של שיטות הרחבה שימושיות למספרים שלמים, שמוסיפות פונקציונליות נוחה שהיית מצפה שתהיה מובנית. תיצור מחלקה סטטית שמכילה שיטות הרחבה שאפשר לקרוא להן ישירות על כל מספר שלם, וכך הקוד שלך יהיה ברור וקריא יותר.
תארגן את הקוד שלך בשני קבצים:
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}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין