Menu
CoddyTech

Penimpaan Method

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

Anak meng-override sebuah method dengan mendefinisikan method bernama sama. Object dari class anak kemudian menjalankan versi milik anak, sedangkan method yang tidak di-override tetap diwarisi tanpa perubahan.

# animal.gd
class_name Animal
extends RefCounted

var animal_name: String

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

func make_sound() -> void:
	print("Some generic animal sound")

func info() -> void:
	print("I am ", animal_name)
# dog.gd
class_name Dog
extends Animal

func make_sound() -> void:
	print("Woof! Woof!")
var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()
Some generic animal sound
Woof! Woof!
I am Buddy

override harus mempertahankan signature milik induknya: parameter yang sama dan tipe pengembalian yang sama. Jika berbeda, program tidak akan berjalan:

# animal.gd
func speak(times: int) -> String:
	return "...".repeat(times)
# dog.gd
func speak() -> String:
	return "Woof"
Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".

Versi anak tetap berjalan meskipun pemanggilan berasal dari method induknya. Di sini introduce() hanya ada di Animal, dan fungsi itu memanggil sound(), yang ditimpa oleh Cat:

# animal.gd
func sound() -> String:
	return "..."

func introduce() -> String:
	return animal_name + " says " + sound()
# cat.gd
func sound() -> String:
	return "Meow"
print(Cat.new("Tom").introduce())
Tom says Meow

Variabel tidak dapat ditimpa: mendeklarasikan var animal_name lagi di Dog akan menyebabkan error penguraian (The member "animal_name" already exists in parent class Animal). Untuk memberikan nilai awal yang berbeda kepada child, tetapkan nilainya di _init() milik child.

challenge icon

Tantangan

Mudah

shape.gd berisi class Shape yang sudah selesai: sebuah color, area() yang mengembalikan 0.0, dan describe(). Circle dan Square mewarisinya dan konstruktornya sudah tersedia. Override dua method pada masing-masing:

  • Circle: area() mengembalikan PI * radius * radius, dan describe() mengembalikan This is a COLOR circle with radius R.
  • Square: area() mengembalikan side * side, dan describe() mengembalikan This is a COLOR square with side S.

Pertahankan signature milik induk: func area() -> float dan func describe() -> String.

Kode yang disediakan membaca jumlah bentuk berikutnya, lalu satu baris untuk setiap bentuk: shape COLOR, circle COLOR RADIUS, atau square COLOR SIDE. Kode ini mencetak describe() dan luas dengan dua angka desimal. Untuk circle red 5 dan shape green, kode ini mencetak:

This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00

Tulis kodemu di circle.gd dan square.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 tetap seperti ini
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		var shape: Shape
		if parts[0] == "circle":
			shape = Circle.new(parts[1], int(parts[2]))
		elif parts[0] == "square":
			shape = Square.new(parts[1], int(parts[2]))
		else:
			shape = Shape.new(parts[1])
		print(shape.describe())
		print("Area: %.2f" % shape.area())
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