Menu
Coddy logo textTech

יסודות הפולימורפיזם

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

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

הדבר עוצמתי, כי אפשר לכתוב קוד שעובד עם טיפוס האב, ובכל זאת הוא מטפל באופן אוטומטי בכל טיפוסי הצאצאים בצורה נכונה:

class Animal {
  void speak() => print('Some sound');
}

class Dog extends Animal {
  @override
  void speak() => print('Woof!');
}

class Cat extends Animal {
  @override
  void speak() => print('Meow!');
}

void main() {
  Animal myPet = Dog();  // טיפוס אב, אובייקט בן
  myPet.speak();  // פלט: Woof!
  
  myPet = Cat();  // אותו משתנה, אובייקט אחר
  myPet.speak();  // פלט: Meow!
}

המשתנה myPet מוכרז מסוג Animal, אבל הוא מכיל Dog או Cat. כשקוראים ל־speak(), Dart בודקת את סוג האובייקט בפועל בזמן ריצה וקוראת למתודה המתאימה שנדרסה.

כך תוכל לכתוב פונקציות גמישות שעובדות עם כל מחלקת משנה:

void makeAllSpeak(List<Animal> animals) {
  for (var animal in animals) {
    animal.speak();  // כל חיה משמיעה קול בדרכה שלה
  }
}

void main() {
  var pets = [Dog(), Cat(), Dog()];
  makeAllSpeak(pets);
  // פלט: Woof! Meow! Woof!
}

הפונקציה לא צריכה להכיר את Dog או את Cat — היא פשוט עובדת עם Animal. כך הקוד שלך ניתן להרחבה יותר, מכיוון שהוספת סוגי בעלי חיים חדשים אינה דורשת שינויים בפונקציות קיימות.

challenge icon

אתגר

קל

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

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

  • instruments.dart: הגדירו כאן את היררכיית כלי הנגינה שלכם:
    • מחלקת Instrument עם מאפיין String name ובנאי. כללו מתודה play() שמדפיסה [name] makes a sound
    • מחלקת Guitar שיורשת מ-Instrument ודורסת את play() כדי להדפיס [name] strums melodically
    • מחלקת Drum שיורשת מ-Instrument ודורסת את play() כדי להדפיס [name] beats rhythmically
    • מחלקת Piano שיורשת מ-Instrument ודורסת את play() כדי להדפיס [name] plays harmoniously
    צרו גם פונקציה performConcert(List<Instrument> instruments) שמדפיסה Concert begins!, ואז עוברת על הרשימה וקוראת ל-play() בכל כלי נגינה, ולבסוף מדפיסה Concert ends!
  • main.dart: ייבאו את קובץ כלי הנגינה שלכם והדגימו פולימורפיזם באמצעות יצירת להקה מעורבת:
    • צרו רשימה מסוג List<Instrument> שמכילה Guitar בשם 'Acoustic',‏ Drum בשם 'Snare' ו-Piano בשם 'Grand'
    • העבירו את הרשימה הזו אל performConcert()

שימו לב ש-performConcert() פועלת עם טיפוס האב Instrument, ובכל זאת כל כלי נגינה מנגן בדרך ייחודית משלו. זהו פולימורפיזם — אותה קריאה למתודה יוצרת התנהגות שונה בהתאם לטיפוס האובייקט בפועל.

פלט צפוי:

Concert begins!
Acoustic strums melodically
Snare beats rhythmically
Grand plays harmoniously
Concert ends!

נסו בעצמכם

import 'instruments.dart';

void main() {
  // TODO: צרו List<Instrument> שמכילה:
  // - Guitar בשם 'Acoustic'
  // - Drum בשם 'Snare'
  // - Piano בשם 'Grand'
  
  
  // TODO: קראו ל-performConcert() עם רשימת כלי הנגינה שלכם
  
}
quiz iconבחנו את עצמכם

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

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

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