Menu
CoddyTech

継承の基本

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

継承を使うと、あるクラスが別のクラスの変数やメソッドを引き継げます。それらを渡すクラスが親クラスで、受け取るクラスが子クラスです。

独自のファイルにある親クラスは次のとおりです。

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

func _init(n: String) -> void:
	animal_name = n

func info() -> void:
	print("I am ", animal_name, ", an animal")

子クラスはextendsの後に親クラスを指定します。親クラスのclass_nameはグローバルなので、dog.gdにインポート行は必要ありません。

# dog.gd
class_name Dog
extends Animal

このDogには独自のコードはありませんが、animal_name、info()、そしてAnimalのコンストラクターを持っています:

var creature := Animal.new("Creature")
var buddy := Dog.new("Buddy")
creature.info()
buddy.info()
I am Creature, an animal
I am Buddy, an animal

子クラスは、継承したメソッドに加えて独自のメソッドを追加できます。その中では、継承した変数を、子クラスで宣言したかのように使えます。

# dog.gd
class_name Dog
extends Animal

func bark() -> void:
	print(animal_name, " says Woof!")
var buddy := Dog.new("Buddy")
buddy.info()
buddy.bark()
I am Buddy, an animal
Buddy says Woof!

継承は一方向です。Animal は Dog が追加するものを受け継がないため、Animal オブジェクトに対して bark() を呼び出すとエラーになります。

これまでに記述したクラスには extends RefCounted と書かれていました。これらは、Godot に組み込まれているクラス RefCounted の子クラスでした。

challenge icon

チャレンジ

簡単

親クラスと子クラスを作成しましょう。

  • vehicle.gdでは、Vehicleに2つのString変数、brandとmodelを持たせます。コンストラクターは2つの引数をそれぞれに格納し、info()はVehicle: BRAND MODELを返します。
  • car.gdにはすでにextends Vehicleと書かれています。そのメソッドhonk()を記述します。継承した変数を使って、BRAND MODEL says Beep beep!を返します。

Carにコンストラクターは必要ありません。Car.new("Honda", "Civic")はVehicleのコンストラクターを使います。

用意されているコードは、後に続く乗り物の数を読み取り、乗り物ごとに1行を読み取ります。各行には、vehicleまたはcar、ブランド、モデルが含まれます。すべての乗り物についてinfo()を出力し、車についてはhonk()も出力します。vehicle Toyota Corollaとcar Honda Civicに対して、次のように出力します。

Vehicle: Toyota Corolla
Vehicle: Honda Civic
Honda Civic says Beep beep!

コードはvehicle.gdとcar.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] == "car":
			var car := Car.new(parts[1], parts[2])
			print(car.info())
			print(car.honk())
		else:
			var vehicle := Vehicle.new(parts[1], parts[2])
			print(vehicle.info())
quiz icon腕試し

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

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

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