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) -> voidNo 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 *= factorUn 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 6Una 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.
Desafío
FácilConstruye un reproductor multimedia en torno a una interfaz.
- En
playable.gd, conviertePlayableen una interfaz: una clase abstracta con los métodos abstractosplay() -> Stringyduration() -> int(en segundos). SongextiendePlayable.play()devuelvePlaying song: TITLE by ARTIST, yduration()devuelve sus segundos.VideoextiendePlayable.play()devuelvePlaying video: TITLE in RESOLUTIONp(por ejemplo,in 1080p), yduration()devuelve sus segundos.Playlistsolo conocePlayable.play_all()imprimeplay()de cada elemento, ytotal_time()devuelve la duración total en el formatoM: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:38Tu 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())
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
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online