Menu
CoddyTech

Repaso de la sobrescritura de métodos

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

El polimorfismo significa «muchas formas»: una llamada a un método hace cosas diferentes según la clase del objeto que la recibe. La sobrescritura es lo que hace que esto funcione.

# animal.gd
class_name Animal
extends RefCounted

func speak() -> String:
	return "..."
# dog.gd
class_name Dog
extends Animal

func speak() -> String:
	return "Woof!"
# cat.gd
class_name Cat
extends Animal

func speak() -> String:
	return "Meow!"

Un Array[Animal] puede contenerlos a todos. El bucle llama a speak() sin saber qué clase tiene cada elemento, y cada objeto responde con su propia versión:

var animals: Array[Animal] = [Dog.new(), Cat.new(), Animal.new()]
for animal in animals:
	print(animal.speak())
Woof!
Meow!
...

Una función con un parámetro Animal funciona de la misma manera. Acepta todas las clases hijas, incluidas las que añadas más adelante, sin necesidad de modificarla:

func make_it_speak(animal: Animal) -> void:
	print("It says ", animal.speak())
make_it_speak(Cat.new())
It says Meow!

Compáralo con comprobar las clases una por una. Una cadena de ramas if animal is Dog: debe crecer con cada clase nueva. Con la sobrescritura, cada clase lleva su propio comportamiento y el código que la llama permanece igual.

challenge icon

Desafío

Fácil

Un garaje gestiona todos los vehículos mediante un único Array[Vehicle]. En vehicle.gd, wheels() devuelve 0 y sound() devuelve ....

  • Escribe describe() en Vehicle. Devuelve BRAND: N wheels, SOUND, llamando a wheels() y sound().
  • Car sobrescribe wheels() con 4 y sound() con Vroom.
  • Motorcycle los sobrescribe con 2 y Brrm.
  • Truck ya almacena el número de trailers. Sobrescribe wheels() con 6 más 4 por remolque, y sound() con Honk.

Las clases derivadas no sobrescriben describe(). El código proporcionado lee cuántos vehículos vienen a continuación y luego una línea por vehículo: car BRAND, motorcycle BRAND, truck BRAND TRAILERS o vehicle BRAND. Imprime cada resultado de describe() y el total de wheels(). Para car Toyota y truck Volvo 2, imprime:

Toyota: 4 wheels, Vroom
Volvo: 14 wheels, Honk
Total wheels: 18

Tu código va en vehicle.gd, car.gd, motorcycle.gd y truck.gd. main.gd contiene el código de entrada y salida proporcionado y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: déjalo tal como está
	var count := int(OS.read_string_from_stdin())
	var vehicles: Array[Vehicle] = []
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		if p[0] == "car":
			vehicles.append(Car.new(p[1]))
		elif p[0] == "motorcycle":
			vehicles.append(Motorcycle.new(p[1]))
		elif p[0] == "truck":
			vehicles.append(Truck.new(p[1], int(p[2])))
		else:
			vehicles.append(Vehicle.new(p[1]))
	var total := 0
	for v in vehicles:
		print(v.describe())
		total += v.wheels()
	print("Total wheels: %d" % total)
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