Menu
Coddy logo textTech

Getters ו-Setters

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

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

Getter מוגדר באמצעות מילת המפתח get ומחזיר ערך מחושב או מאוחסן:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

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

setter משתמש במילת המפתח set ומאפשר לך לשלוט באופן שבו ערך מוקצה:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

ה-setter מאמת את הקלט לפני שמירתו ויכול אפילו להמיר בין יחידות. כך יש לך שליטה על הנתונים שלך, תוך שמירה על תחביר נקי, דמוי מאפיין, עבור המשתמשים במחלקה שלך.

challenge icon

אתגר

קל

בואו נבנה מעקב ניקוד למשחק שמשתמש בפעולות getter ו-setter לניהול הנתונים הסטטיסטיים של השחקן, עם אימות וערכים מחושבים.

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

  • player.dart: הגדֵר מחלקה Player שעוקבת אחר ביצועי השחקן במשחק. המחלקה שלך צריכה לכלול:
    • שדה String name עבור שם השחקן
    • שדה פרטי int _score שמתחיל ב-0
    • שדה פרטי int _lives שמתחיל ב-3
    • בנאי שמקבל את שם השחקן
    • getter בשם score שמחזיר את הניקוד הנוכחי
    • setter בשם score שמקבל רק ערכים של 0 ומעלה (התעלם מערכים שליליים)
    • getter בשם lives שמחזיר את מספר החיים הנוכחי
    • setter בשם lives שמקבל רק ערכים שבין 0 ל-5, כולל (התעלם מערכים מחוץ לטווח הזה)
    • getter בשם level שמחשב את דרגת השחקן לפי הניקוד: הניקוד חלקי 100 (חלוקה שלמה), ועוד 1
    • getter בשם isAlive שמחזיר true אם מספר החיים גדול מ-0
    • מתודה displayStatus() שמדפיסה את המצב הנוכחי של השחקן
  • main.dart: ייבא את מחלקת השחקן שלך והדגם את פעולות ה-getter וה-setter:
    • צור שחקן בשם 'Alex'
    • הגדר את הניקוד ל-250 וקרא ל-displayStatus()
    • נסה להגדיר את הניקוד ל--50 (יש להתעלם מהערך) וקרא ל-displayStatus()
    • הגדר את מספר החיים ל-1 וקרא ל-displayStatus()
    • נסה להגדיר את מספר החיים ל-10 (יש להתעלם מהערך) וקרא ל-displayStatus()

המתודה displayStatus() צריכה להדפיס בפורמט המדויק הזה:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

פלט צפוי:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

נסו בעצמכם

import 'player.dart';

void main() {
  // TODO: צרו שחקן בשם 'Alex'

  // TODO: הגדירו את הניקוד ל-250 וקראו ל-displayStatus()

  // TODO: נסו להגדיר את הניקוד ל--50 (יש להתעלם מהשינוי) וקראו ל-displayStatus()

  // TODO: הגדירו את מספר החיים ל-1 וקראו ל-displayStatus()

  // TODO: נסו להגדיר את מספר החיים ל-10 (יש להתעלם מהשינוי) וקראו ל-displayStatus()
}
quiz iconבחנו את עצמכם

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

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

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