Menu
Coddy logo textTech

מילת המפתח super

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

מילת המפתח super מאפשרת למחלקת בת גישה ישירה למחלקת האב שלה. כבר ראית אותה בבנאים עם super(name), אבל היא שימושית גם בהקשרים אחרים.

כשצריך לקרוא לבנאי של מחלקת האב, super מעביר ארגומנטים במעלה שרשרת הירושה:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

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

class Animal {
  String name;
  
  Animal(this.name);
  
  void makeSound() {
    print('$name makes a sound');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // קרא קודם למתודה של מחלקת האב
    print('$name says meow!');
  }
}

כשאתה קורא ל־super.makeSound(), אתה מפעיל במפורש את הגרסה של המתודה במחלקת האב. בלי super, קריאה ל־makeSound() תתייחס למתודה של המחלקה הנוכחית, ועלולה לגרום לרקורסיה אינסופית.

חשוב על super כאילו אתה אומר "השתמש בגרסה של ההורה שלי" — בין אם זו בנאית, מתודה או מאפיין.

challenge icon

אתגר

קל

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

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

  • message.dart: הגדירו כאן את מחלקות ההודעות:
    • מחלקת Message (מחלקת האב) עם String sender ו-String content. הוסיפו בנאי שמקבל את שני הערכים, ומתודה display() שמדפיסה From [sender]: [content]
    • מחלקת UrgentMessage שמרחיבה את Message. צריכה להיות לה תכונה נוספת String priority. הבנאי מקבל שולח, תוכן ועדיפות, ומעביר את שני הערכים הראשונים למחלקת האב באמצעות super. דרסו את המתודה display() כך שתחילה תקרא לגרסה של מחלקת האב באמצעות super.display(), ולאחר מכן תדפיס בשורה הבאה Priority: [priority]
  • main.dart: ייבאו את קובץ ההודעות והדגימו כיצד super פועלת גם בבנאים וגם במתודות:
    • צרו Message רגילה מאת 'Alice' עם התוכן 'Hello there!'
    • קראו למתודה display() שלה
    • הדפיסו שורה ריקה להפרדה
    • צרו UrgentMessage מאת 'Bob' עם התוכן 'Server is down!' ובעדיפות 'HIGH'
    • קראו למתודה display() שלה

שימו לב כיצד UrgentMessage משתמשת ב-super בשתי דרכים: בבנאי כדי להעביר נתונים למחלקת האב, ובמתודה שנדרסה כדי לכלול את הפלט של מחלקת האב לפני הוספת הפלט שלה.

פלט צפוי:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

נסו בעצמכם

import 'message.dart';

void main() {
  // TODO: צרו Message רגילה מאת 'Alice' עם התוכן 'Hello there!'
  
  // TODO: קראו למתודה display() על ההודעה
  
  // TODO: הדפיסו שורה ריקה להפרדה
  
  // TODO: צרו UrgentMessage מאת 'Bob' עם התוכן 'Server is down!' והעדיפות 'HIGH'
  
  // TODO: קראו למתודה display() על ההודעה הדחופה
}
quiz iconבחנו את עצמכם

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

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

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