Menu
Coddy logo textTech

האנוטציה @override

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

ההערה @override היא סימון שנחשב לפרקטיקה מומלצת, ומציין ל-Dart (ולמפתחים אחרים) שאת/ה מחליף/ה בכוונה מתודה ממחלקת האב. אף שדריסת מתודות עובדת גם בלעדיו, השימוש ב-@override מוסיף שכבת הגנה חשובה.

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

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

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

חשוב מה קורה אם מאייתים את שם המתודה באופן שגוי בלי @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // שגיאת כתיב! אין אזהרה בלי @override
    print('$name meows');
  }
}

ללא ההערה, Dart מניח שאתה יוצר מתודה חדשה בשם speek(). עם @override, המנתח יסמן מיד שאין מתודה כזאת במחלקת האב. ההערה הפשוטה הזאת מונעת באגים עדינים שעלולים להיות קשים לאיתור בהמשך.

challenge icon

אתגר

קל

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

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

  • media.dart: הגדירו כאן את היררכיית המדיה:
    • מחלקה Media עם מאפיין String title, בנאי שמקבל את הכותרת ומתודה play() שמדפיסה Playing: [title]
    • מחלקה Song שמרחיבה את Media ומוסיפה מאפיין String artist. השתמשו בהערה @override ושכתבו את play() כדי להדפיס Playing song: [title] by [artist]
    • מחלקה Video שמרחיבה את Media ומוסיפה מאפיין int duration (בשניות). השתמשו ב-@override ושכתבו את play() כך שקודם תקרא לגרסה של מחלקת האב באמצעות super.play(), ואז תדפיס Duration: [duration] seconds
  • main.dart: ייבאו את קובץ המדיה והדגימו את המתודות שנכתבו מחדש:
    • צרו אובייקט Media עם הכותרת 'Generic Content' וקראו ל-play()
    • הדפיסו שורה ריקה
    • צרו Song עם הכותרת 'Imagine' ועם האמן 'John Lennon', ואז קראו ל-play()
    • הדפיסו שורה ריקה
    • צרו Video עם הכותרת 'Dart Tutorial' ומשך של 360, ואז קראו ל-play()

ההערה @override מתעדת את כוונתכם ועוזרת לזהות שגיאות. אם תקלידו בטעות plya() במקום play(), ההערה תתריע שאין מתודה כזאת במחלקת האב.

פלט צפוי:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

נסו בעצמכם

import 'media.dart';

void main() {
  // TODO: צרו אובייקט Media עם הכותרת 'Generic Content' וקראו ל־play()
  
  
  // TODO: הדפיסו שורה ריקה
  
  
  // TODO: צרו אובייקט Song עם הכותרת 'Imagine' והאמן 'John Lennon', ואז קראו ל־play()
  
  
  // TODO: הדפיסו שורה ריקה
  
  
  // TODO: צרו אובייקט Video עם הכותרת 'Dart Tutorial' ומשך של 360, ואז קראו ל־play()
  
}
quiz iconבחנו את עצמכם

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

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

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