الأعضاء العامة والخاصة
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 26 من 65.
يعني التغليف أن الكائن يحتفظ ببياناته مع الأساليب التي تغيّر تلك البيانات، ويحدّد أيًّا من أعضائه يمكن للكود الآخر استخدامه. وتشكل الأعضاء المخصّصة للكود الآخر واجهة الكائن.
لا تتضمن GDScript كلمتي public أو private: يمكن الوصول إلى كل عضو من الخارج. ويحدد دليل أسلوب Godot الأعضاء الخاصة بشرطة سفلية في بداية الاسم:
# bank_account.gd
class_name BankAccount
extends RefCounted
var owner_name: String
var _balance: int = 0
var _history: Array[String] = []
func _init(holder: String) -> void:
owner_name = holder
func deposit(amount: int) -> void:
_balance += amount
_record("deposit %d" % amount)
func get_balance() -> int:
return _balance
func _record(entry: String) -> void:
_history.append(entry)owner_name وdeposit() وget_balance() عامة، لذا يستخدمها main.gd. أما _balance و_history و_record() فهي خاصة: لا يستخدمها سوى الكود داخل bank_account.gd.
# main.gd
var account := BankAccount.new("Ada")
account.deposit(50)
account.deposit(20)
print(account.owner_name) # Ada
print(account.get_balance()) # 70الشرطة السفلية اصطلاح وليست قفلًا: يعمل account._balance = 1000000 في main.gd دون أي خطأ. التزم بالاصطلاح على أي حال. عندما يكون الصنف هو الوحيد الذي يغيّر _balance، فلا يمكن أن يأتي الرصيد الخاطئ إلا من إحدى الدوال في bank_account.gd، لذا فهذا هو الملف الوحيد الذي عليك التحقق منه.
لا يحتوي GDScript على مستوى protected أيضًا. ترث الفئة الفرعية كل الأعضاء، بما في ذلك الأعضاء الخاصة، لذا يمكن لـ SavingsAccount التي extends BankAccount استخدام _balance في أساليبها الخاصة.
تبدأ الطرق الافتراضية في Godot، مثل _init() و_ready()، أيضًا بشرطة سفلية. يستدعيها Godot نيابةً عنك، لذا لا تُطلق الاسم نفسه على أيٍّ من طرقك الخاصة.
التحدي
سهلأكمل الصنف Hero في hero.gd. أعضاؤه العامة هي hero_name وgain_xp() وget_xp() وget_level(). أما الباقي فهو خاص:
- أضف المتغيرين الخاصين
_xp(يبدأ عند0) و_level(يبدأ عند1). - أضف الطريقة الخاصة
_update_level()، التي تضبط_levelعلى1 + _xp / 100(قسمة الأعداد الصحيحة). - تضيف
gain_xp(amount)القيمةamountإلى_xp، وتستدعي_update_level()، وتُرجعtrueعندما يرتفع المستوى، وfalseخلاف ذلك. - تُرجع
get_xp()وget_level()القيم الخاصة.
تقرأ الشيفرة المزوّدة اسم البطل، ثم عدد قيم XP التالية، ثم قيمة واحدة في كل سطر. بعد كل قيمة، تطبع سطر Level up! عندما تُرجع gain_xp() القيمة true، ثم تطبع حالة البطل. بالنسبة إلى Ada والقيم 40 و70 و250، تطبع:
Ada: 40 XP, level 1
Level up! Ada is now level 2
Ada: 110 XP, level 2
Level up! Ada is now level 4
Ada: 360 XP, level 4ضع شيفرتك في hero.gd. يحتوي main.gd على شيفرة الإدخال/الإخراج المزوّدة، ولا يمكن تعديله.
جرّب بنفسك
extends Node
func _ready():
# كود الإدخال/الإخراج المقدَّم: اتركه كما هو
var hero := Hero.new(OS.read_string_from_stdin())
var count := int(OS.read_string_from_stdin())
for i in count:
var amount := int(OS.read_string_from_stdin())
if hero.gain_xp(amount):
print("Level up! %s is now level %d" % [hero.hero_name, hero.get_level()])
print("%s: %d XP, level %d" % [hero.hero_name, hero.get_xp(), hero.get_level()])
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت