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.
Desafío
FácilUn garaje gestiona todos los vehículos mediante un único Array[Vehicle]. En vehicle.gd, wheels() devuelve 0 y sound() devuelve ....
- Escribe
describe()enVehicle. DevuelveBRAND: N wheels, SOUND, llamando awheels()ysound(). Carsobrescribewheels()con4ysound()conVroom.Motorcyclelos sobrescribe con2yBrrm.Truckya almacena el número detrailers. Sobrescribewheels()con6más4por remolque, ysound()conHonk.
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: 18Tu 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)
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