継承の基本
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 の子クラスでした。
チャレンジ
簡単親クラスと子クラスを作成しましょう。
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())
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ