Menu
CoddyTech

Ördek Tiplemesi

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

Ördek tiplemesi, bir nesnenin hangi sınıfa ait olduğuyla değil, ne yapabildiğiyle ilgilenir. Çağırdığınız metoda sahipse, çağrı çalışır. Bu ad, "ördek gibi yüzüyor ve ördek gibi vaklıyorsa, ördektir" sözünden gelir.

Bu iki sınıfın ortak bir üst sınıfı yoktur, ancak ikisinde de swim() ve quack() bulunur:

# duck.gd
class_name Duck
extends RefCounted

func swim() -> String:
	return "Duck swimming"

func quack() -> String:
	return "Quack!"
# robot.gd
class_name Robot
extends RefCounted

func swim() -> String:
	return "Robot swimming with propellers"

func quack() -> String:
	return "Robot sound: BEEP BEEP!"

Türü belirtilmemiş bir parametre her nesneyi kabul eder. İşlev metotları çağırır ve her nesne kendi metodunu çalıştırır:

func make_it_swim_and_quack(thing) -> void:
	print(thing.swim())
	print(thing.quack())
make_it_swim_and_quack(Duck.new())
make_it_swim_and_quack(Robot.new())
Duck swimming
Quack!
Robot swimming with propellers
Robot sound: BEEP BEEP!

Üzerine yazma ortak bir üst sınıf gerektirir; ördek tiplemesi gerektirmez. Parametre thing: Duck olarak türlendirildiğinde, Robot geçirmek bir ayrıştırma hatasına neden olur.

Bir nesnede bu yöntem yoksa çağrı, Invalid call. Nonexistent function 'quack' gibi bir hatayla işlevi durdurur. Önce has_method() ile kontrol et; bu yöntem, yöntem adını String olarak alır:

var things := [Duck.new(), Rock.new()]
for thing in things:
	if thing.has_method("quack"):
		print(thing.quack())
	else:
		print("This one cannot quack")
Quack!
This one cannot quack

Bedeli: türlerle Godot, program çalışmadan önce yanlış bir yöntem adını bulur; ördek tiplemesiyle bunu ancak satır çalıştığında öğrenirsiniz. Bunu, birkaç yöntemi paylaşan ilgisiz sınıfların nesneleri için kullanın.

challenge icon

Görev

Kolay

Bir patlama, yakındaki hasar alabilen her şeye zarar verir. Nesnelerin ortak bir üst sınıfı yoktur. player.gd ve rock.gd tamamlanmıştır: bir Player nesnesinde take_damage(amount) ve status(), bir Rock nesnesinde ise yalnızca status() bulunur.

  • crate.gd dosyasında, Crate için başlangıç değeri false olan bir broken değişkeni, miktar 10 veya daha fazla olduğunda sandığı kıran bir take_damage(amount) yöntemi ve Crate: broken veya Crate: intact döndüren bir status() yöntemi yaz.
  • explosion.gd dosyasında, statik hit_all(things, amount) yöntemini yaz. Array içindeki bu yönteme sahip her nesnede take_damage(amount) çağrısı yapar ve kaç nesneye isabet ettiğini döndürür.

Sağlanan kod, nesne adlarından oluşan bir satırı (player, crate veya rock), ardından kaç patlama olacağını ve her birinin vereceği hasarı okur. Her patlamanın kaç nesneye isabet ettiğini, ardından her nesnenin durumunu yazdırır. player crate rock ve 5 ile 20 hasar veren patlamalar için şu çıktıyı verir:

Explosion 1 hit 2 objects
Explosion 2 hit 2 objects
Player: 75 HP
Crate: broken
Rock: solid

Kodunu crate.gd ve explosion.gd dosyalarına yaz. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
	var things := []
	for word in OS.read_string_from_stdin().split(" "):
		if word == "player":
			things.append(Player.new())
		elif word == "crate":
			things.append(Crate.new())
		else:
			things.append(Rock.new())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var hits := Explosion.hit_all(things, int(OS.read_string_from_stdin()))
		print("Explosion %d hit %d objects" % [i + 1, hits])
	for thing in things:
		print(thing.status())
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