Ö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 quackBedeli: 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.
Görev
KolayBir 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.gddosyasında,Crateiçin başlangıç değerifalseolan birbrokendeğişkeni, miktar10veya daha fazla olduğunda sandığı kıran birtake_damage(amount)yöntemi veCrate: brokenveyaCrate: intactdöndüren birstatus()yöntemi yaz.explosion.gddosyasında, statikhit_all(things, amount)yöntemini yaz. Array içindeki bu yönteme sahip her nesnedetake_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: solidKodunu 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())
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarNesne Yönelimli Programlamaya GirişSınıflar ve Nesnelerself Anahtar KelimesiMetotlarÖzelliklerKurucu (_init)Tekrar - Basit Hesap Makinesi4Çok Biçimlilik
Metot Ezme Konusuna Yeniden BakışÖrdek TiplemesiSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı7Sinyaller
Sinyal Nedir?Tanımlama ve Sinyal GöndermeSinyallere BağlanmaArgümanlı SinyallerTekrar - Sağlık Sistemi10Tasarım Kalıpları 2. Bölüm
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik Kalıp2Sınıf Özellikleri
Örnek ve Statik DeğişkenlerStatik FonksiyonlarÖzellik AyarlayıcılarıÖzellik AlıcılarıGeleneksel Olarak ÖzelTekrar - Banka Hesabı Yöneticisi5Kapsülleme
Public ve Private ÜyelerSetter'larla DoğrulamaBilgi GizlemeSalt Okunur ÖzelliklerTekrar - Öğrenci Kayıt SistemiKendi başına pratik yap: Online GDScript derleyicisi