Menu
CoddyTech

Inner Class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 41 dari 65.

Sebuah class dapat mendeklarasikan class lain di dalamnya, dengan kata kunci class, sebuah nama, dan isi yang diindentasi. Class bagian dalam ini adalah tipe pembantu yang menjadi bagian dari class luar:

# 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

Di dalam inventory.gd, class di dalamnya adalah Slot. Semua file lainnya mengaksesnya melalui class luar: 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)

Inner class tanpa extends mewarisi RefCounted, dan dapat memiliki variabel, konstruktor, serta method seperti class apa pun. Inner class dapat menggunakan konstanta dan enum milik outer class (MAX_STACK di atas), tetapi tidak dapat menggunakan variabel anggotanya: Slot tidak dapat mengakses slots, karena sebuah slot adalah object yang terpisah. Berikan nilai apa pun yang dibutuhkannya kepada konstruktor.

Gunakan inner class untuk tipe kecil yang hanya masuk akal bersama outer class-nya, seperti slot inventaris atau entri tabel skor. Tipe yang digunakan sendiri oleh bagian lain dalam game sebaiknya memiliki file dan class_name sendiri.

challenge icon

Tantangan

Mudah

Buat Leaderboard yang entri-entrinya merupakan inner class.

  • Deklarasikan inner class Entry di dalam Leaderboard, dengan player_name dan score yang ditetapkan oleh konstruktornya, serta _to_string() yang mengembalikan Ada: 120.
  • entries adalah array bertipe Entry, dengan urutan sesuai kemunculan pertama para pemain.
  • submit(player, score) menambahkan entri baru untuk pemain baru. Untuk pemain yang sudah memiliki entri, fungsi ini mempertahankan nilai yang lebih tinggi dari kedua skor.
  • best() mengembalikan entri dengan skor tertinggi. Jika seri, entri yang muncul lebih dulu menjadi yang terpilih.

Kode yang disediakan membaca jumlah skor yang akan diberikan (Ada 120), memasukkannya, lalu mencetak setiap entri dan entri terbaik (setidaknya satu skor selalu diberikan). Untuk Ada 120, Bo 90, Ada 80, Bo 150, Cy 150, kode ini mencetak:

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

Letakkan kodemu di leaderboard.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online