Menu
CoddyTech

Metot Ezme Konusuna Yeniden Bakış

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 21 / 65.

Çok biçimlilik, "birçok biçim" anlamına gelir: tek bir yöntem çağrısı, onu alan nesnenin sınıfına bağlı olarak farklı şeyler yapar. Üzerine yazma, bunun çalışmasını sağlar.

# 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!"

Bir Array[Animal] hepsini tutabilir. Döngü, her öğenin hangi sınıfa ait olduğunu bilmeden speak() işlevini çağırır ve her nesne kendi sürümüyle yanıt verir:

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

Animal parametresi olan bir işlev aynı şekilde çalışır. Sonradan eklediğin sınıflar da dahil olmak üzere tüm alt sınıfları değişiklik yapmadan kabul eder:

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

Bunu sınıfları tek tek kontrol etmekle karşılaştırın. if animal is Dog: dallarından oluşan bir zincir, her yeni sınıfla birlikte uzamak zorundadır. Geçersiz kılma kullanıldığında her sınıf kendi davranışını taşır ve onu çağıran kod aynı kalır.

challenge icon

Görev

Kolay

Bir garaj, tüm araçları tek bir Array[Vehicle] üzerinden yönetir. vehicle.gd dosyasında wheels(), 0 döndürür ve sound(), ... döndürür.

  • Vehicle içinde describe() yaz. Bu metot, wheels() ve sound() metotlarını çağırarak BRAND: N wheels, SOUND döndürür.
  • Car, wheels() metodunu 4 ve sound() metodunu Vroom ile geçersiz kılar.
  • Motorcycle, bunları sırasıyla 2 ve Brrm ile geçersiz kılar.
  • Truck, trailers sayısını zaten saklar. wheels() metodunu, her bir römork için 6 artı 4 döndürecek şekilde; sound() metodunu ise Honk döndürecek şekilde geçersiz kılar.

Alt sınıflar describe() metodunu geçersiz kılmaz. Verilen kod, ardından kaç araç geleceğini ve her araç için bir satır okur: car BRAND, motorcycle BRAND, truck BRAND TRAILERS veya vehicle BRAND. Her describe() sonucunu ve wheels() toplamını yazdırır. car Toyota ve truck Volvo 2 için şu çıktıyı verir:

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

Kodunu vehicle.gd, car.gd, motorcycle.gd ve truck.gd dosyalarına yaz. main.gd, verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
	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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi