דריסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 38 מתוך 110.
דריסת מתודה מתרחשת כאשר מחלקת בת מספקת מימוש משלה למתודה שכבר קיימת במחלקת האב. כך תתי־מחלקות יכולות להתאים אישית התנהגות שהן יורשות, תוך שמירה על אותה חתימת מתודה.
כשמגדירים מתודה במחלקת בת עם אותו שם ואותם פרמטרים כמו מתודה במחלקת האב, הגרסה של מחלקת הבת מחליפה אותה:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic משמיע קול
dog.speak(); // Buddy נובח: Woof!
}כשקוראים ל־speak() במופע של Dog, Dart מבצעת את הגרסה של Dog, ולא של Animal. מחלקת הבת דרסה את המתודה של מחלקת האב.
אפשר גם לשלב דריסה עם super כדי להרחיב את ההתנהגות של מחלקת האב במקום להחליף אותה:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // קרא קודם לגרסה של מחלקת האב
print('$name also purrs');
}
}התבנית הזו מאפשרת לך לבנות על פונקציונליות קיימת. הכלל המרכזי פשוט: מתודה בעלת שם ופרמטרים זהים במחלקת הבת מחליפה את המימוש של מחלקת האב כשקוראים לה במופעים של מחלקת הבת.
אתגר
קלבואו נבנה מערכת התראות שמדגימה כיצד מחלקות-צאצא יכולות לדרוס מתודות של מחלקת-אב כדי להתאים אישית את ההתנהגות. תיצרו סוגי התראות שונים, שכל אחד מהם מעביר הודעות בדרך ייחודית משלו.
תארגנו את הקוד שלכם בשני קבצים:
notification.dart: הגדירו כאן את היררכיית ההתראות:- מחלקת
Notification(מחלקת-האב) עםString titleו-String message. הוסיפו בנאי שמקבל את שני הערכים ומתודהsend()שמדפיסהNotification: [title] - [message] - מחלקת
EmailNotificationשמרחיבה אתNotificationומוסיפה מאפייןString recipient. דרסו את המתודהsend()כך שתדפיסSending email to [recipient]: [title] - [message] - מחלקת
PushNotificationשמרחיבה אתNotificationומוסיפה מאפייןString deviceId. דרסו את המתודהsend()כך שתחילה תקרא למתודתsend()של מחלקת-האב באמצעותsuper, ואז תדפיסPushed to device: [deviceId]בשורה הבאה
- מחלקת
main.dart: ייבאו את קובץ ההתראות והדגימו דריסת מתודות בפעולה:- צרו מופע בסיסי של
Notificationעם הכותרת'Alert'וההודעה'System update available' - קראו למתודה
send()שלו - הדפיסו שורה ריקה
- צרו
EmailNotificationעם הכותרת'Welcome', ההודעה'Thanks for signing up!'והנמען'user@example.com' - קראו למתודה
send()שלו - הדפיסו שורה ריקה
- צרו
PushNotificationעם הכותרת'Reminder', ההודעה'Meeting in 10 minutes'ו-deviceId'DEVICE-001' - קראו למתודה
send()שלו
- צרו מופע בסיסי של
שימו לב כיצד EmailNotification מחליפה לחלוטין את ההתנהגות של מחלקת-האב, בעוד PushNotification מרחיבה אותה באמצעות קריאה תחילה ל-super.send(). שתי הגישות הן דרכים תקפות לדריסת מתודות, בהתאם לצרכים שלכם.
הפלט הצפוי:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001נסו בעצמכם
import 'notification.dart';
void main() {
// TODO: צרו Notification בסיסי עם title 'Alert' ו-message 'System update available'
// קראו למתודה send() שלו
// TODO: הדפיסו שורה ריקה
// TODO: צרו EmailNotification עם:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// קראו למתודה send() שלו
// TODO: הדפיסו שורה ריקה
// TODO: צרו PushNotification עם:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// קראו למתודה send() שלו
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין