Menu
CoddyTech

Desain Interface

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 24 dari 65.

Interface adalah daftar method yang dijanjikan akan dimiliki oleh sebuah class, tanpa kode di baliknya. Java dan C# memiliki kata kunci interface; GDScript tidak. Kamu membuat hal yang sama dari class abstrak yang semua method-nya bersifat abstrak:

# drawable.gd
@abstract
class_name Drawable
extends RefCounted

@abstract func draw() -> String
@abstract func resize(factor: int) -> void

Antarmuka ini tidak memiliki variabel dan isi method. Antarmuka ini menjelaskan hal yang dapat dilakukan oleh sesuatu yang dapat digambar, lalu setiap class menentukan caranya:

# 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

Circle juga dapat memperluas Drawable, dengan radius serta draw() dan resize() miliknya sendiri. Kode yang menggunakan interface hanya bergantung padanya, sehingga kode tersebut berfungsi dengan setiap class yang memperluas Drawable, termasuk yang ditulis nanti:

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

Sebuah class memiliki satu parent, jadi hanya bisa memperluas satu interface. Saat sebuah class memiliki peran kedua, seperti disimpan ke file, perluas interface utama dan periksa peran kedua dengan has_method():

if item.has_method("save"):
	item.save()

Buat setiap interface tetap kecil: beberapa method yang termasuk dalam satu peran. class yang memperluasnya hanya menulis method yang dibutuhkannya.

challenge icon

Tantangan

Mudah

Buat pemutar media yang menggunakan sebuah interface.

  • Di playable.gd, jadikan Playable sebuah interface: class abstrak dengan method abstrak play() -> String dan duration() -> int (dalam detik).
  • Song mewarisi Playable. play() mengembalikan Playing song: TITLE by ARTIST, dan duration() mengembalikan jumlah detiknya.
  • Video mewarisi Playable. play() mengembalikan Playing video: TITLE in RESOLUTIONp (misalnya in 1080p), dan duration() mengembalikan jumlah detiknya.
  • Playlist hanya mengenal Playable. play_all() mencetak hasil play() dari setiap item, dan total_time() mengembalikan total durasi dalam format M:SS (detik ditulis dengan dua digit, misalnya 4:05).

Konstruktor Song dan Video sudah ditulis. Kode yang disediakan membaca jumlah item yang akan dimasukkan, lalu satu baris untuk setiap item: song TITLE ARTIST SECONDS atau video TITLE RESOLUTION SECONDS. Kode tersebut memanggil play_all() dan mencetak total durasinya. Untuk song Imagine Lennon 183 dan video Trailer 1080 95, kode mencetak:

Playing song: Imagine by Lennon
Playing video: Trailer in 1080p
Total time: 4:38

Tulis kodemu di playable.gd, song.gd, video.gd, dan playlist.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online