Menu
CoddyTech

内部クラス

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 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を作成します。

  • Leaderboard内に内部クラスEntryを宣言します。コンストラクターでplayer_nameとscoreを設定し、_to_string()はAda: 120を返します。
  • entriesはEntryの型付き配列で、プレイヤーが最初に登場した順に並べます。
  • submit(player, score)は、新しいプレイヤーのエントリーを追加します。すでにエントリーがあるプレイヤーの場合は、2つのスコアのうち高い方を保持します。
  • best()は、スコアが最も高いエントリーを返します。同点の場合は、先に登場したエントリーが優先されます。

用意されたコードは、後に続くスコアの個数(Ada 120)を読み取り、それらを登録した後、すべてのエントリーと最高のエントリーを出力します(スコアは少なくとも1つ与えられます)。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オンラインコンパイラ