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) -> voidAntarmuka 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 *= factorCircle 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 6Sebuah 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.
Tantangan
MudahBuat pemutar media yang menggunakan sebuah interface.
- Di
playable.gd, jadikanPlayablesebuah interface: class abstrak dengan method abstrakplay() -> Stringdanduration() -> int(dalam detik). SongmewarisiPlayable.play()mengembalikanPlaying song: TITLE by ARTIST, danduration()mengembalikan jumlah detiknya.VideomewarisiPlayable.play()mengembalikanPlaying video: TITLE in RESOLUTIONp(misalnyain 1080p), danduration()mengembalikan jumlah detiknya.Playlisthanya mengenalPlayable.play_all()mencetak hasilplay()dari setiap item, dantotal_time()mengembalikan total durasi dalam formatM:SS(detik ditulis dengan dua digit, misalnya4: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:38Tulis 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())
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPclass dan objectKata Kunci selfmethodpropertyKonstruktor (_init)Ringkasan: Kalkulator Sederhana4Polimorfisme
Method Overriding Sekali LagiDuck TypingKelas Abstrak dan MethodDesain InterfaceRingkasan: Kalkulator Bentuk7Sinyal
Apa itu Sinyal?Mendeklarasikan dan MemancarkanMenghubungkan ke SinyalSinyal dengan ArgumenRangkuman, Sistem Kesehatan10Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola Composite2Property class
Variabel instance vs. variabel statisFungsi statisSetter propertyGetter propertyPrivat berdasarkan konvensiRangkuman: Pengelola Rekening Bank5Enkapsulasi
Member Publik dan PrivatValidasi dengan SetterPenyembunyian InformasiProperty Hanya-BacaRingkasan: Sistem Catatan Siswa8Konsep OOP Lanjutan
Komposisi vs PewarisanInner ClassNode sebagai KomponenRefCounted vs NodeEnum dalam Class11Proyek: Manajemen Perpustakaan
Gambaran Umum Proyekclass Buku dan PenggunaLatihan sendiri: Compiler GDScript online