Menu
CoddyTech

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) -> void

Değ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 *= factor

Bir 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 6

Bir 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.

challenge icon

Görev

Kolay

Bir arayüz etrafında bir medya oynatıcı oluştur.

  • playable.gd içinde Playable'ı bir arayüz hâline getir: play() -> String ve duration() -> int (saniye cinsinden) soyut metotlarına sahip soyut bir sınıf.
  • Song, Playable'ı genişletir. play(), Playing song: TITLE by ARTIST döndürür ve duration() saniye değerini döndürür.
  • Video, Playable'ı genişletir. play(), Playing video: TITLE in RESOLUTIONp döndürür (örneğin in 1080p) ve duration() saniye değerini döndürür.
  • Playlist yalnızca Playable'ı bilir. play_all() her öğenin play() metodunu yazdırır ve total_time() toplam süreyi M:SS biçiminde döndürür (saniye iki basamaklı olacak şekilde; örneğin 4: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:38

Kodunu 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())
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