الدوال الساكنة
جزء من قسم البرمجة كائنية التوجّه في رحلة 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)) # true
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أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت