Progettazione delle interfacce
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 24 di 65.
Un’interfaccia è un elenco di metodi che una classe promette di avere, senza codice al loro interno. Java e C# hanno una parola chiave interface; GDScript no. Puoi creare la stessa cosa a partire da una classe astratta i cui metodi sono tutti astratti:
# drawable.gd
@abstract
class_name Drawable
extends RefCounted
@abstract func draw() -> String
@abstract func resize(factor: int) -> voidNon ha variabili né corpi di metodo. Descrive cosa può fare un oggetto disegnabile e ogni classe decide come:
# 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 *= factorAnche un Circle può estendere Drawable, con un radius e i propri draw() e resize(). Il codice che usa l'interfaccia dipende solo da essa, quindi funziona con ogni classe che estende Drawable, comprese quelle scritte in seguito:
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 6Una classe ha un genitore, quindi può estendere una sola interfaccia. Quando una classe svolge un secondo ruolo, ad esempio essere salvata in un file, estendi l’interfaccia principale e verifica il secondo ruolo con has_method():
if item.has_method("save"):
item.save()Mantieni ogni interfaccia piccola: pochi metodi che appartengono a un unico ruolo. Una classe che la estende scrive quindi solo i metodi di cui ha bisogno.
Sfida
FacileCrea un lettore multimediale basato su un'interfaccia.
- In
playable.gd, rendiPlayableun'interfaccia: una classe astratta con i metodi astrattiplay() -> Stringeduration() -> int(in secondi). SongestendePlayable.play()restituiscePlaying song: TITLE by ARTIST, eduration()restituisce i suoi secondi.VideoestendePlayable.play()restituiscePlaying video: TITLE in RESOLUTIONp(per esempioin 1080p), eduration()restituisce i suoi secondi.Playlistconosce soloPlayable.play_all()stampaplay()di ogni elemento, etotal_time()restituisce la durata totale nel formatoM:SS(secondi con due cifre, per esempio4:05).
I costruttori di Song e Video sono già scritti. Il codice fornito legge quanti elementi seguono, poi una riga per ogni elemento: song TITLE ARTIST SECONDS oppure video TITLE RESOLUTION SECONDS. Chiama play_all() e stampa il tempo totale. Per song Imagine Lennon 183 e video Trailer 1080 95 stampa:
Playing song: Imagine by Lennon
Playing video: Trailer in 1080p
Total time: 4:38Il tuo codice va inserito in playable.gd, song.gd, video.gd e playlist.gd. main.gd contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
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())
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore GDScript online