Arayüz Tasarımı
Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 65.
Arayüz, bir sınıfın herhangi bir kod içermeyen bir dizi metoda sahip olmayı taahhüt etmesidir. Java ve C#'ta bir interface anahtar sözcüğü vardır; GDScript'te yoktur. Aynı şeyi, tüm metotları soyut olan bir soyut sınıftan oluşturabilirsin:
# drawable.gd
@abstract
class_name Drawable
extends RefCounted
@abstract func draw() -> String
@abstract func resize(factor: int) -> voidDeğişkeni ve yöntem gövdesi yoktur. Çizilebilir bir şeyin neler yapabileceğini açıklar ve her sınıf bunun nasıl yapılacağına karar verir:
# banner.gd
class_name Banner
extends Drawable
var text: String
var size := 1
func _init(t: String) -> void:
text = t
func draw() -> String:
return "Banner '%s' at size %d" % [text, size]
func resize(factor: int) -> void:
size *= factorBir Circle, radius ve kendine ait draw() ile resize() yöntemleriyle Drawable sınıfını da genişletebilir. Arayüzü kullanan kod yalnızca bu arayüze bağlıdır; bu nedenle, daha sonra yazılanlar da dâhil olmak üzere Drawable sınıfını genişleten her sınıfla çalışır:
func render_all(items: Array[Drawable]) -> void:
for item in items:
item.resize(2)
print(item.draw())var items: Array[Drawable] = [Banner.new("Sale"), Circle.new(3)]
render_all(items)Banner 'Sale' at size 2
Circle with radius 6Bir sınıfın bir ebeveyni vardır, bu nedenle yalnızca bir arayüzü genişletebilir. Bir sınıf dosyaya kaydedilmek gibi ikinci bir rol üstlendiğinde, ana arayüzü genişletin ve ikinci rolü has_method() ile kontrol edin:
if item.has_method("save"):
item.save()Her arayüzü küçük tut: tek bir role ait birkaç metottan oluşsun. Bu arayüzü genişleten bir sınıf, yalnızca ihtiyaç duyduğu metotları yazar.
Görev
KolayBir arayüz etrafında bir medya oynatıcı oluştur.
playable.gdiçindePlayable'ı bir arayüz hâline getir:play() -> Stringveduration() -> int(saniye cinsinden) soyut metotlarına sahip soyut bir sınıf.Song,Playable'ı genişletir.play(),Playing song: TITLE by ARTISTdöndürür veduration()saniye değerini döndürür.Video,Playable'ı genişletir.play(),Playing video: TITLE in RESOLUTIONpdöndürür (örneğinin 1080p) veduration()saniye değerini döndürür.PlaylistyalnızcaPlayable'ı bilir.play_all()her öğeninplay()metodunu yazdırır vetotal_time()toplam süreyiM:SSbiçiminde döndürür (saniye iki basamaklı olacak şekilde; örneğin4:05).
Song ve Video kurucuları yazılmıştır. Sağlanan kod, ardından kaç öğe geleceğini okur ve sonra her öğe için bir satır okur: song TITLE ARTIST SECONDS veya video TITLE RESOLUTION SECONDS. play_all() metodunu çağırır ve toplam süreyi yazdırır. song Imagine Lennon 183 ve video Trailer 1080 95 için şu çıktıyı verir:
Playing song: Imagine by Lennon
Playing video: Trailer in 1080p
Total time: 4:38Kodunu playable.gd, song.gd, video.gd ve playlist.gd dosyalarına yaz. main.gd, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
extends Node
func _ready():
# Verilen giriş/çıkış kodu: olduğu gibi bırakın
var count := int(OS.read_string_from_stdin())
var playlist := Playlist.new()
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "song":
playlist.add(Song.new(p[1], p[2], int(p[3])))
else:
playlist.add(Video.new(p[1], int(p[2]), int(p[3])))
playlist.play_all()
print("Total time: " + playlist.total_time())
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