Menu
CoddyTech

İç Sınıflar

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 65.

Bir sınıf, class anahtar sözcüğünü, bir adı ve girintili bir gövdeyi kullanarak kendi içinde başka bir sınıf bildirebilir. Bu iç sınıf, dış sınıfa ait bir yardımcı türdür:

# 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 içinde iç sınıf Slot'tur. Diğer tüm dosyalar bu sınıfa dış sınıf üzerinden erişir: 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 kullanmayan bir iç sınıf, RefCounted sınıfını genişletir ve her sınıf gibi değişkenlere, bir kurucuya ve yöntemlere sahip olabilir. Dış sınıfın sabitlerini ve enum'larını (MAX_STACK yukarıda) kullanabilir, ancak üye değişkenlerini kullanamaz: Slot, slots değişkenine erişemez çünkü bir yuva ayrı bir nesnedir. İhtiyaç duyduğu değerleri kurucusuna aktar.

Yalnızca dış sınıfıyla birlikte anlamlı olan küçük bir tür için iç sınıf kullan; örneğin bir envanter yuvası veya puan tablosu girdisi. Oyunun diğer bölümlerinin tek başına kullandığı bir tür, kendi dosyasını ve class_name adını hak eder.

challenge icon

Görev

Kolay

Girdileri iç sınıf olan bir Leaderboard oluştur.

  • Leaderboard içinde Entry iç sınıfını tanımla; player_name ve score kurucusu tarafından ayarlansın ve _to_string() Ada: 120 döndürsün.
  • entries, oyuncuların ilk göründükleri sıraya göre sıralanan, Entry türünde bir dizidir.
  • submit(player, score), yeni bir oyuncu için yeni bir girdi ekler. Zaten girdisi olan bir oyuncu için iki skordan yüksek olanı tutar.
  • best(), en yüksek skora sahip girdiyi döndürür. Eşitlik durumunda ilk sırada görünen girdi kazanır.

Verilen kod, ardından kaç skor geleceğini okur (Ada 120), bunları gönderir, sonra her girdiyi ve en iyi olanı yazdırır (her zaman en az bir skor verilir). Ada 120, Bo 90, Ada 80, Bo 150, Cy 150 için şunu yazdırır:

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

Kodunu leaderboard.gd dosyasına yaz. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi