אילוצים גנריים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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' קיים
}
}
}אילוצים גנריים משלבים את הגמישות של גנריקה עם הביטחון שנובע מהידיעה אילו פעולות זמינות עבור הטיפוס שלך.
אתגר
קלבואו נבנה מחשבון סטטיסטיקה שעובד רק עם טיפוסים מספריים! תיצרו מחלקה גנרית עם אילוץ שמבטיח שאפשר להשתמש בה רק עם מספרים, וכך תוכלו לבצע בבטחה פעולות מתמטיות על הערכים המאוחסנים.
תארגנו את הקוד בשני קבצים:
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()
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין