Menu
Coddy logo textTech

דריסת מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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');
  }
}

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

challenge icon

אתגר

קל

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

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

  • 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() שלו
}
quiz iconבחנו את עצמכם

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

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

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