Menu
CoddyTech

Diseño de interfaces

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 24 de 65.

Una interfaz es una lista de métodos que una clase se compromete a tener, sin código detrás de ellos. Java y C# tienen una palabra clave interface; GDScript no. Puedes crear lo mismo a partir de una clase abstracta cuyos métodos sean todos abstractos:

# drawable.gd
@abstract
class_name Drawable
extends RefCounted

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

No tiene variables ni cuerpos de método. Describe lo que puede hacer un elemento dibujable, y cada clase decide cómo:

# 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

Un Circle también puede extender Drawable, con un radius y sus propios métodos draw() y resize(). El código que usa la interfaz solo depende de ella, así que funciona con todas las clases que extienden Drawable, incluidas las que se escriban más adelante:

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 clase tiene un padre, así que solo puede extender una interfaz. Cuando una clase desempeña un segundo papel, como guardarse en un archivo, extiende la interfaz principal y comprueba el segundo papel con has_method():

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

Mantén cada interfaz pequeña: unos pocos métodos que pertenezcan a un único rol. Una clase que la amplíe después escribirá solo los métodos que necesite.

challenge icon

Desafío

Fácil

Construye un reproductor multimedia en torno a una interfaz.

  • En playable.gd, convierte Playable en una interfaz: una clase abstracta con los métodos abstractos play() -> String y duration() -> int (en segundos).
  • Song extiende Playable. play() devuelve Playing song: TITLE by ARTIST, y duration() devuelve sus segundos.
  • Video extiende Playable. play() devuelve Playing video: TITLE in RESOLUTIONp (por ejemplo, in 1080p), y duration() devuelve sus segundos.
  • Playlist solo conoce Playable. play_all() imprime play() de cada elemento, y total_time() devuelve la duración total en el formato M:SS (segundos con dos dígitos, por ejemplo, 4:05).

Los constructores de Song y Video ya están escritos. El código proporcionado lee cuántos elementos siguen y luego una línea por elemento: song TITLE ARTIST SECONDS o video TITLE RESOLUTION SECONDS. Llama a play_all() e imprime el tiempo total. Para song Imagine Lennon 183 y video Trailer 1080 95, imprime:

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

Tu código va en playable.gd, song.gd, video.gd y playlist.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: mantenlo tal como está
	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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online