Sobrescritura de métodos
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 17 de 65.
Un hijo sobrescribe un método definiendo otro método con el mismo nombre. Los objetos de la clase hija ejecutan entonces la versión de la hija, y los métodos que no sobrescribe siguen heredándose sin cambios.
# animal.gd
class_name Animal
extends RefCounted
var animal_name: String
func _init(n: String) -> void:
animal_name = n
func make_sound() -> void:
print("Some generic animal sound")
func info() -> void:
print("I am ", animal_name)# dog.gd
class_name Dog
extends Animal
func make_sound() -> void:
print("Woof! Woof!")var animal := Animal.new("Generic")
var dog := Dog.new("Buddy")
animal.make_sound()
dog.make_sound()
dog.info()Some generic animal sound
Woof! Woof!
I am BuddyLa sobrescritura debe mantener la firma del padre: los mismos parámetros y el mismo tipo de retorno. Con una diferente, el programa no se inicia:
# animal.gd
func speak(times: int) -> String:
return "...".repeat(times)# dog.gd
func speak() -> String:
return "Woof"Parse Error: The function signature doesn't match the parent. Parent signature is "speak(int) -> String".La versión de la clase hija se ejecuta incluso cuando la llamada proviene de un método de la clase padre. Aquí, introduce() existe solo en Animal, y llama a sound(), que Cat sobrescribe:
# animal.gd
func sound() -> String:
return "..."
func introduce() -> String:
return animal_name + " says " + sound()# cat.gd
func sound() -> String:
return "Meow"print(Cat.new("Tom").introduce())Tom says MeowLas variables no se pueden sobrescribir: volver a declarar var animal_name en Dog es un error de análisis (The member "animal_name" already exists in parent class Animal). Para darle a una clase hija un valor inicial diferente, asígnalo en el _init() de la clase hija.
Desafío
Fácilshape.gd contiene la clase Shape terminada: un color, area() que devuelve 0.0 y describe(). Circle y Square la extienden y ya tienen sus constructores. Sobrescribe dos métodos en cada una:
Circle:area()devuelvePI * radius * radius, ydescribe()devuelveThis is a COLOR circle with radius R.Square:area()devuelveside * side, ydescribe()devuelveThis is a COLOR square with side S.
Conserva las firmas de la clase padre: func area() -> float y func describe() -> String.
El código proporcionado lee cuántas formas siguen y, después, una línea por forma: shape COLOR, circle COLOR RADIUS o square COLOR SIDE. Imprime describe() y el área con dos decimales. Para circle red 5 y shape green, imprime:
This is a red circle with radius 5
Area: 78.54
This is a green shape
Area: 0.00Tu código va en circle.gd y square.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: déjalo tal como está
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var shape: Shape
if parts[0] == "circle":
shape = Circle.new(parts[1], int(parts[2]))
elif parts[0] == "square":
shape = Square.new(parts[1], int(parts[2]))
else:
shape = Shape.new(parts[1])
print(shape.describe())
print("Area: %.2f" % shape.area())
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