Menu
CoddyTech

superキーワード

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 16/65。

子クラスで追加のデータが必要な場合は、独自の _init() を記述します。すると、親クラスのコンストラクターは自動では実行されなくなります。親クラスが期待する引数を渡して、super() を呼び出します。

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n
	print("Animal created: ", n)
# dog.gd
class_name Dog
extends Animal

var breed: String

func _init(n: String, b: String) -> void:
	super(n)
	breed = b
	print("Dog breed set: ", b)
var buddy := Dog.new("Buddy", "Beagle")
print(buddy.animal_name, " the ", buddy.breed)
Animal created: Buddy
Dog breed set: Beagle
Buddy the Beagle

super(n)の行がなくてもプログラムは実行されますが、Animalのコンストラクターはスキップされます。animal_nameを設定するものがないため、空のStringのままです。子クラスが親クラスの変数を使う前に準備できるよう、最初にsuper()を置きましょう。

それ以外のメソッドでは、super() は現在のメソッドの親クラス版を実行します。子クラスは親クラスの結果を保持し、そこに追加します。

# animal.gd
func describe() -> String:
	return "I am " + animal_name
# dog.gd
func describe() -> String:
	return super() + ", a " + breed
var rex := Dog.new("Rex", "Husky")
print(rex.describe())
Animal created: Rex
Dog breed set: Husky
I am Rex, a Husky

別の親メソッドを呼び出すには、ドットの後にその名前を書きます。super.describe()はDogのどのメソッドからでも使えます。

challenge icon

チャレンジ

簡単

Personクラスと、それを継承するEmployeeクラスを作成してください。

  • Personはコンストラクターでperson_nameとageを保存します。introduce()はHi, I'm NAME and I'm AGE years oldを返します。
  • Employeeはjobを追加します。コンストラクターでは名前と年齢をsuper()に渡し、職業を保存します。introduce()は、親クラスのintroduce()の結果の後に. I work as a JOBを続けて返します。

与えられたコードは、続く人数を読み取った後、1人につき1行を読み取ります。形式はperson NAME AGEまたはemployee NAME AGE JOBです。それぞれについてintroduce()を出力します。person Alice 30とemployee Bob 35 Developerの場合、次のように出力されます:

Hi, I'm Alice and I'm 30 years old
Hi, I'm Bob and I'm 35 years old. I work as a Developer

コードはperson.gdとemployee.gdに記述してください。main.gdには与えられた入出力コードが含まれており、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード:そのままにしてください
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "employee":
			var employee := Employee.new(parts[1], int(parts[2]), parts[3])
			print(employee.introduce())
		else:
			var person := Person.new(parts[1], int(parts[2]))
			print(person.introduce())
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ