Menu
Coddy logo textTech

מתודות גנריות

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

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

מתודה גנרית מצהירה על פרמטר הטיפוס שלה לפני טיפוס ההחזרה:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // שלום
}

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

var result = findFirst([10, 20, 30]);  // Dart מסיקה את הטיפוס int

שיטות גנריות שימושיות במיוחד בתוך מחלקות כאשר רק פעולות מסוימות צריכות גמישות בסוג:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // הטיפוס הוסק כ-int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

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

challenge icon

אתגר

קל

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

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

  • transformer.dart: צרו מחלקה Transformer עם המתודות הגנריות הבאות:
    • T getFirst<T>(List<T> items) - מחזירה את האיבר הראשון מתוך מערך
    • T getLast<T>(List<T> items) - מחזירה את האיבר האחרון מתוך מערך
    • List<T> repeat<T>(T item, int times) - יוצרת מערך המכיל את האיבר כשהוא חוזר כמספר הפעמים שצוין
    • void printPair<A, B>(A first, B second) - מדפיסה שני ערכים בפורמט Pair: [first] and [second]
  • main.dart: ייבאו את קובץ ההתמרה והדגימו כל מתודה גנרית עם טיפוסים שונים:
    • צרו מופע של Transformer
    • השתמשו ב-getFirst על [10, 20, 30] והדפיסו את התוצאה
    • השתמשו ב-getFirst על ['apple', 'banana', 'cherry'] והדפיסו את התוצאה
    • השתמשו ב-getLast על [1.5, 2.5, 3.5] והדפיסו את התוצאה
    • השתמשו ב-repeat כדי ליצור מערך שבו 'Hi' חוזר 4 פעמים, והדפיסו את התוצאה
    • השתמשו ב-repeat כדי ליצור מערך שבו 7 חוזר 3 פעמים, והדפיסו את התוצאה
    • השתמשו ב-printPair עם 'Name' ו-42
    • השתמשו ב-printPair עם 100 ו-true

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

פלט צפוי:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

נסו בעצמכם

import 'transformer.dart';

void main() {
  // צרו מופע של Transformer
  var transformer = Transformer();

  // TODO: השתמשו ב-getFirst על [10, 20, 30] והדפיסו את התוצאה

  // TODO: השתמשו ב-getFirst על ['apple', 'banana', 'cherry'] והדפיסו את התוצאה

  // TODO: השתמשו ב-getLast על [1.5, 2.5, 3.5] והדפיסו את התוצאה

  // TODO: השתמשו ב-repeat כדי ליצור רשימה שבה 'Hi' מופיע 4 פעמים, והדפיסו אותה

  // TODO: השתמשו ב-repeat כדי ליצור רשימה שבה 7 מופיע 3 פעמים, והדפיסו אותה

  // TODO: השתמשו ב-printPair עם 'Name' ו-42

  // TODO: השתמשו ב-printPair עם 100 ו-true
}
quiz iconבחנו את עצמכם

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

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

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