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

الأصناف الداخلية

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 41 من 65.

يمكن للصنف أن يعرّف صنفًا آخر بداخله باستخدام الكلمة المفتاحية class، واسم، ومتن ذي مسافة بادئة. هذا الصنف الداخلي نوع مساعد ينتمي إلى الصنف الخارجي:

# inventory.gd
class_name Inventory
extends RefCounted

const MAX_STACK := 5

class Slot:
	var item_name: String
	var count: int

	func _init(new_name: String, new_count: int) -> void:
		item_name = new_name
		count = mini(new_count, MAX_STACK)

	func _to_string() -> String:
		return "%s x%d" % [item_name, count]

var slots: Array[Slot] = []

func add(item_name: String, count: int) -> Slot:
	var slot := Slot.new(item_name, count)
	slots.append(slot)
	return slot

داخل inventory.gd، الصنف الداخلي هو Slot. تصل إليه جميع الملفات الأخرى عبر الصنف الخارجي: Inventory.Slot.

# main.gd
var bag := Inventory.new()
bag.add("Potion", 9)
var arrows: Inventory.Slot = bag.add("Arrow", 3)
print(bag.slots)    # [Potion x5, Arrow x3]
var gem := Inventory.Slot.new("Gem", 1)

الصنف الداخلي الذي لا يستخدم extends يرث من RefCounted، ويمكن أن يحتوي على متغيرات وبانٍ وطرائق مثل أي صنف. يمكنه استخدام الثوابت والتعدادات الخاصة بالصنف الخارجي (MAX_STACK أعلاه)، لكن ليس متغيرات أعضائه: لا يمكن لـ Slot الوصول إلى slots، لأن الخانة كائن منفصل. مرّر إليه في الباني أي قيمة يحتاج إليها.

استخدم صنفًا داخليًا لنوع صغير لا يكون منطقيًا إلا مع صنفه الخارجي، مثل خانة في مخزون أو إدخال في جدول نتائج. أما النوع الذي تستخدمه أجزاء أخرى من اللعبة بمفرده، فيستحق ملفًا خاصًا به وclass_name.

challenge icon

التحدي

سهل
Leaderboard تكون إدخالاته فئة داخلية.

  • عرّف الفئة الداخلية Entry داخل Leaderboard، واجعل مُنشئها يحدّد player_name وscore، واجعل _to_string() يعيد Ada: 120.
  • entries مصفوفة ذات نوع محدد من Entry، وبترتيب ظهور اللاعبين لأول مرة.
  • تضيف submit(player, score) إدخالًا جديدًا للاعب جديد. أما اللاعب الذي لديه إدخال بالفعل، فتحتفظ بالأعلى بين النتيجتين.
  • تعيد best() الإدخال صاحب أعلى نتيجة. وعند التعادل، يفوز الإدخال الذي يظهر أولًا.

يقرأ الكود الموفّر عدد النتائج التالية (Ada 120)، ثم يرسلها، وبعد ذلك يطبع كل إدخال وأفضلها (تُعطى نتيجة واحدة على الأقل دائمًا). بالنسبة إلى Ada 120، Bo 90، Ada 80، Bo 150، Cy 150، تكون مخرجاته:

Ada: 120
Bo: 150
Cy: 150
Best: Bo: 150

ضع الكود في leaderboard.gd. يحتوي main.gd على كود الإدخال/الإخراج الموفّر ولا يمكن تعديله.

جرّب بنفسك

extends Node

func _ready():
	# كود الإدخال/الإخراج المقدَّم: اتركه كما هو
	var board := Leaderboard.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		board.submit(parts[0], int(parts[1]))
	for entry in board.entries:
		print(entry)
	print("Best: ", board.best())
quiz iconاختبر نفسك

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

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

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