Menu
Coddy logo textTech

מתודת call()

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 73 מתוך 110.

ל-Dart יש מתודה מיוחדת בשם call() שמאפשרת להשתמש באובייקט כאילו היה פונקציה. כשמחלקה מגדירה מתודת call(), אפשר להפעיל מופעים של אותה מחלקה באמצעות תחביר של קריאת פונקציה.

class Multiplier {
  int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  var triple = Multiplier(3);
  
  print(double(5));  // 10 - קריאה לאובייקט כמו לפונקציה
  print(triple(5));  // 15
}

במקום לכתוב double.call(5), אפשר פשוט לכתוב double(5). Dart מפעילה אוטומטית את המתודה call() כשמשתמשים בסוגריים על האובייקט.

המתודה call() יכולה לקבל כל פרמטר ולהחזיר כל טיפוס, בדיוק כמו מתודה רגילה:

class Greeter {
  String prefix;
  
  Greeter(this.prefix);
  
  String call(String name, {String punctuation = '!'}) {
    return '$prefix, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));  // שלום, אליס!
  print(hello('Bob', punctuation: '?'));  // שלום, בוב?
}

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

challenge icon

אתגר

קל

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

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

  • formatters.dart: צרו שתי מחלקות שאפשר לקרוא להן, אשר משנות מחרוזות:
    • מחלקת Wrapper שעוטפת טקסט בקידומת ובסיומת שניתנות להגדרה. עליה לשמור מחרוזות prefix ו-suffix, והשיטה call() שלה צריכה לקבל String text ולהחזיר את הטקסט כשהוא עטוף בקידומת ובסיומת.
    • מחלקת Repeater שחוזרת על טקסט מספר פעמים שניתן להגדרה. עליה לשמור מספר שלם times, והשיטה call() שלה צריכה לקבל String text ולהחזיר את הטקסט כשהוא חוזר על עצמו מספר הפעמים הזה, עם רווחים בין החזרות.
  • main.dart: ייבאו את מעצבי הטקסט והדגימו איך אפשר להשתמש באובייקטים האלה ממש כמו בפונקציות:
    • צרו Wrapper עם הקידומת '[' והסיומת ']'
    • צרו Wrapper נוסף עם הקידומת '***' והסיומת '***'
    • צרו Repeater עם הערך 3 עבור times
    • קראו ל-wrapper הראשון עם 'Hello' והדפיסו את התוצאה
    • קראו ל-wrapper השני עם 'Important' והדפיסו את התוצאה
    • קראו ל-repeater עם 'Go' והדפיסו את התוצאה
    • הדגימו שרשור על ידי העברת התוצאה של ה-wrapper הראשון (עם 'Nested') אל ה-wrapper השני, והדפיסו את התוצאה

שימו לב שאפשר לקרוא לאובייקטים של מעצבי הטקסט ישירות באמצעות סוגריים, ממש כמו לפונקציות רגילות. השיטה call() מאפשרת זאת, וכל אובייקט זוכר את הגדרות התצורה שלו בין שימוש לשימוש!

פלט צפוי:

[Hello]
***Important***
Go Go Go
***[Nested]***

נסו בעצמכם

import 'formatters.dart';

void main() {
  // TODO: צרו Wrapper עם prefix '[' ו-suffix ']'
  
  // TODO: צרו Wrapper נוסף עם prefix '***' ו-suffix '***'
  
  // TODO: צרו Repeater שבו times מוגדר ל-3
  
  // TODO: קראו ל-Wrapper הראשון עם 'Hello' והדפיסו את התוצאה
  
  // TODO: קראו ל-Wrapper השני עם 'Important' והדפיסו את התוצאה
  
  // TODO: קראו ל-Repeater עם 'Go' והדפיסו את התוצאה
  
  // TODO: הדגימו שרשור על ידי העברת התוצאה של ה-Wrapper הראשון
  // (עם 'Nested') ל-Wrapper השני, והדפיסו את התוצאה
}
quiz iconבחנו את עצמכם

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

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

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