Menu
Coddy logo textTech

אילוצים גנריים

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

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

השתמשו במילת המפתח extends כדי להגביל פרמטר טיפוס:

class NumberBox<T extends num> {
  T value;
  
  NumberBox(this.value);
  
  T doubled() => (value * 2) as T;
}

void main() {
  var intBox = NumberBox<int>(5);
  var doubleBox = NumberBox<double>(3.5);
  
  print(intBox.doubled());    // 10
  print(doubleBox.doubled()); // 7.0
  
  // var stringBox = NumberBox<String>('hi');  // שגיאה!
}

מכיוון ש־T extends num, המהדר יודע ש־value תומך בפעולות מספריות כמו כפל. ללא האילוץ הזה, הקריאה ל־value * 2 תיכשל.

אילוצים פועלים גם עם היררכיות המחלקות שלך:

abstract class Animal {
  String get name;
}

class Dog extends Animal {
  String get name => 'Dog';
}

class Shelter<T extends Animal> {
  List<T> animals = [];
  
  void add(T animal) => animals.add(animal);
  
  void printNames() {
    for (var animal in animals) {
      print(animal.name);  // בטוח: T מבטיח ש-'name' קיים
    }
  }
}

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

challenge icon

אתגר

קל

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

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

  • stats.dart: צרו מחלקה גנרית Stats<T extends num> שמנהלת רשימה של ערכים מספריים:
    • List<T> בשם values לאחסון המספרים
    • בנאי שמאתחל את הרשימה עם הערכים שסופקו
    • מתודה sum() שמחזירה את סכום כל הערכים בתור num
    • מתודה min() שמחזירה את הערך הקטן ביותר בתור T
    • מתודה max() שמחזירה את הערך הגדול ביותר בתור T
    • מתודה printStats() שמציגה את הנתונים הסטטיסטיים בפורמט מסודר
  • main.dart: ייבאו את קובץ הסטטיסטיקה והדגימו את המחלקה הגנרית המוגבלת עם טיפוסים מספריים שונים:
    • צרו Stats<int> עם הערכים [10, 25, 5, 30, 15] וקראו ל-printStats()
    • הדפיסו שורה ריקה
    • צרו Stats<double> עם הערכים [3.5, 1.2, 4.8, 2.1] וקראו ל-printStats()

המתודה printStats() אמורה להציג שלוש שורות שמראות את הסכום, הערך המינימלי והערך המקסימלי. מכיוון ש-T extends num, תוכלו להשתמש בבטחה באופרטורי השוואה ובפעולות חשבון על הערכים — דבר שלא היה אפשרי עם טיפוס גנרי ללא אילוץ.

פלט צפוי:

Sum: 85
Min: 5
Max: 30

Sum: 11.6
Min: 1.2
Max: 4.8

נסו בעצמכם

import 'stats.dart';

void main() {
  // TODO: צרו Stats<int> עם הערכים [10, 25, 5, 30, 15]
  // וקראו ל־printStats()
  
  // TODO: הדפיסו שורה ריקה
  
  // TODO: צרו Stats<double> עם הערכים [3.5, 1.2, 4.8, 2.1]
  // וקראו ל־printStats()
}
quiz iconבחנו את עצמכם

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

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

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