Menu
CoddyTech

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

Non 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 *= factor

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

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

challenge icon

Sfida

Facile

Crea un lettore multimediale basato su un'interfaccia.

  • In playable.gd, rendi Playable un'interfaccia: una classe astratta con i metodi astratti play() -> String e duration() -> int (in secondi).
  • Song estende Playable. play() restituisce Playing song: TITLE by ARTIST, e duration() restituisce i suoi secondi.
  • Video estende Playable. play() restituisce Playing video: TITLE in RESOLUTIONp (per esempio in 1080p), e duration() restituisce i suoi secondi.
  • Playlist conosce solo Playable. play_all() stampa play() di ogni elemento, e total_time() restituisce la durata totale nel formato M:SS (secondi con due cifre, per esempio 4: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:38

Il 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())
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore GDScript online