Menu
CoddyTech

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 Buddy

La 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 Meow

Las 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.

challenge icon

Desafío

Fácil

shape.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() devuelve PI * radius * radius, y describe() devuelve This is a COLOR circle with radius R.
  • Square: area() devuelve side * side, y describe() devuelve This 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.00

Tu 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())
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