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