Menu
CoddyTech

Method Overriding Sekali Lagi

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

Polimorfisme berarti "banyak bentuk": satu pemanggilan method melakukan hal yang berbeda, bergantung pada class object yang menerimanya. Penggantian method memungkinkan hal ini.

# animal.gd
class_name Animal
extends RefCounted

func speak() -> String:
	return "..."
# dog.gd
class_name Dog
extends Animal

func speak() -> String:
	return "Woof!"
# cat.gd
class_name Cat
extends Animal

func speak() -> String:
	return "Meow!"

Sebuah Array[Animal] dapat menampung semuanya. Perulangan memanggil speak() tanpa mengetahui class mana yang dimiliki setiap elemennya, dan setiap object menjawab dengan versinya sendiri:

var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
	print(animal.speak())
Woof!
Meow!
...

Fungsi dengan parameter Animal bekerja dengan cara yang sama. Fungsi ini menerima setiap class turunan, termasuk class yang kamu tambahkan nanti, tanpa perubahan:

func make_it_speak(animal: Animal) -> void:
	print("It says ", animal.speak())
make_it_speak(Cat.new())
It says Meow!

Bandingkan ini dengan memeriksa class satu per satu. Rangkaian percabangan if animal is Dog: harus bertambah setiap kali ada class baru. Dengan overriding, setiap class memiliki perilakunya sendiri, dan kode yang memanggilnya tetap sama.

challenge icon

Tantangan

Mudah

Sebuah garasi menangani setiap kendaraan melalui satu Array[Vehicle]. Di vehicle.gd, wheels() mengembalikan 0 dan sound() mengembalikan ....

  • Tulis describe() di Vehicle. Fungsi ini mengembalikan BRAND: N wheels, SOUND, dengan memanggil wheels() dan sound().
  • Car meng-override wheels() dengan 4 dan sound() dengan Vroom.
  • Motorcycle meng-override keduanya dengan 2 dan Brrm.
  • Truck sudah menyimpan jumlah trailers. Class ini meng-override wheels() dengan 6 ditambah 4 untuk setiap trailer, dan sound() dengan Honk.

Class turunan tidak meng-override describe(). Kode yang disediakan membaca jumlah kendaraan berikutnya, lalu satu baris untuk setiap kendaraan: car BRAND, motorcycle BRAND, truck BRAND TRAILERS atau vehicle BRAND. Kode ini mencetak setiap describe() dan total wheels(). Untuk car Toyota dan truck Volvo 2, kode ini mencetak:

Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18

Tulis kodemu di vehicle.gd, car.gd, motorcycle.gd dan truck.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 count := int(OS.read_string_from_stdin())
	var vehicles: Array[Vehicle] = []
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "car":
			vehicles.append(Car.new(p[1]))
		elif p[0] == "motorcycle":
			vehicles.append(Motorcycle.new(p[1]))
		elif p[0] == "truck":
			vehicles.append(Truck.new(p[1], int(p[2])))
		else:
			vehicles.append(Vehicle.new(p[1]))
	var total := 0
	for v in vehicles:
		print(v.describe())
		total += v.wheels()
	print("Total wheels: %d" % total)
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