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.
Görev
KolayBir 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.
Vehicleiçindedescribe()yaz. Bu metot,wheels()vesound()metotlarını çağırarakBRAND: N wheels, SOUNDdöndürür.Car,wheels()metodunu4vesound()metodunuVroomile geçersiz kılar.Motorcycle, bunları sırasıyla2veBrrmile geçersiz kılar.Truck,trailerssayısını zaten saklar.wheels()metodunu, her bir römork için6artı4döndürecek şekilde;sound()metodunu iseHonkdö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: 18Kodunu 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)
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