Menu
CoddyTech
flag Ar iconالعربيةdown icon

الأعضاء العامة والخاصة

جزء من قسم البرمجة كائنية التوجّه في رحلة 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 نيابةً عنك، لذا لا تُطلق الاسم نفسه على أيٍّ من طرقك الخاصة.

challenge icon

التحدي

سهل

أكمل الصنف 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()])
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجّه

تدرّب بنفسك: مترجم GDScript عبر الإنترنت