פונקציות סטטיות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 10 מתוך 65.
פונקציית static func שייכת למחלקה, כמו משתנה סטטי. קוראים לה דרך שם המחלקה, בלי אובייקט, כפי שעשית בשיעור על קבצים: Greeter.greet("Ada"). מחלקה יכולה לשלב פונקציות סטטיות עם מתודות רגילות:
# student.gd
class_name Student
extends RefCounted
static var count: int = 0
var student_name: String
var score: int
func _init(new_name: String, new_score: int) -> void:
student_name = new_name
score = new_score
count += 1
static func is_passing(points: int) -> bool:
return points >= 60
static func from_line(line: String) -> Student:
var parts := line.split(" ")
return Student.new(parts[0], int(parts[1]))print(Student.is_passing(72)) # אמת
var ada := Student.from_line("Ada 91")
print(ada.score) # 91
print(Student.count) # 1פונקציה סטטית פועלת ללא אובייקט, ולכן היא לא יכולה להשתמש במשתני מופע או ב־self: השימוש ב־score בתוך is_passing() הוא שגיאה שמדווחת לפני שהתוכנית רצה. היא יכולה להשתמש בפרמטרים שלה, בקבועים, במשתנים סטטיים ובפונקציות סטטיות אחרות.
from_line() מציגה שימוש נפוץ: פונקציה סטטית שבונה ומחזירה אובייקט, במקרה זה מתוך שורת טקסט. זוהי דרך שנייה ליצור Student, לצד Student.new().
אפשר גם לקרוא לפונקציה סטטית על אובייקט, כמו ב־ada.is_passing(50), אבל שם המחלקה מבהיר שלא מעורב כאן אובייקט.
אתגר
קלכתבו את קוד מתן הציונים בשתי מחלקות.
ל־Grader בקובץ grader.gd יש פונקציות סטטיות בלבד:
letter(points)מחזירה"A"עבור 90 ומעלה,"B"עבור 80 ומעלה,"C"עבור 70 ומעלה,"D"עבור 60 ומעלה, ו־"F"מתחת לכךis_passing(points)מחזירהtrueעבור 60 ומעלה
ל־Student בקובץ student.gd כבר יש את המאפיינים ואת הבנאי. השלימו:
- את הפונקציה הסטטית
from_line(line), שמפצלת שורה כמוAda 91בנקודת הרווח ומחזירהStudentחדש עם השם והציון האלה - את המתודה
report(), שמחזירהNAME: SCORE (LETTER), passedאוNAME: SCORE (LETTER), failed, תוך שימוש בשתי הפונקציות שלGrader
הקוד שסופק קורא כמה תלמידים מופיעים בהמשך, יוצר כל אחד מהם באמצעות Student.from_line(), מדפיס את הדוח שלו ולבסוף סופר את התלמידים שעברו. עבור Ada 91, Bo 42 ו־Cy 75 הוא מדפיס:
Ada: 91 (A), passed
Bo: 42 (F), failed
Cy: 75 (C), passed
Passed: 2 of 3הקוד שלכם צריך להופיע בקבצים grader.gd ו־student.gd. הקובץ main.gd מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.
נסו בעצמכם
extends Node
func _ready():
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
var count := int(OS.read_string_from_stdin())
var passed := 0
for i in count:
var student := Student.from_line(OS.read_string_from_stdin())
print(student.report())
if Grader.is_passing(student.score):
passed += 1
print("Passed: %d of %d" % [passed, count])
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין