Menu
CoddyTech

Cadenas de herencia

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

Una clase hija puede ser a su vez una clase padre. Cada extends añade un nivel a la cadena de herencia:

# vehicle.gd
class_name Vehicle
extends RefCounted

var wheels: int

func _init(w: int) -> void:
	wheels = w

func describe() -> String:
	return "%d wheels" % wheels
# car.gd
class_name Car
extends Vehicle

func _init() -> void:
	super(4)

func describe() -> String:
	return "Car with " + super()
# race_car.gd
class_name RaceCar
extends Car

var top_speed: int

func _init(speed: int) -> void:
	super()
	top_speed = speed

func describe() -> String:
	return super() + ", top speed %d" % top_speed

RaceCar tiene todo lo de Car y Vehicle. Cada super() sube un nivel, así que una llamada ejecuta las tres versiones de describe():

print(RaceCar.new(300).describe())
Car with 4 wheels, top speed 300

Cuando llamas a un método o lees una variable, Godot busca primero en la propia clase del objeto, después en su clase padre, luego en la clase padre de esta y usa la primera que encuentra. RaceCar.new(300).wheels se encuentra en Vehicle, dos niveles más arriba.

Cada clase tiene exactamente un padre. extends acepta una sola clase, y enumerar dos es un error de análisis:

class_name FlyingCar
extends Car, Plane
Parse Error: Expected end of statement after superclass, found "," instead.

GDScript no admite la herencia múltiple. Cuando una clase necesita las características de dos clases, colócalas en una misma cadena o dale un objeto de la otra clase con el que trabajar (en un capítulo posterior se aborda esto).

challenge icon

Desafío

Fácil

character.gd contiene la clase Character terminada: un nombre, hp, describe() que devuelve NAME (HP HP) y attack() que devuelve 1. Construye dos niveles más a partir de ella:

  • Warrior extiende Character y añade strength. Su constructor pasa el nombre y los puntos de vida a super(). describe() añade , strength S al texto de la clase padre, y attack() devuelve la fuerza.
  • Knight extiende Warrior y añade armor. Su constructor pasa el nombre, los puntos de vida y la fuerza a super(). describe() añade , armor A al texto de Warrior, y attack() devuelve el ataque de Warrior más 5.

El código proporcionado lee cuántos personajes vienen después y, a continuación, una línea por personaje: character NAME HP, warrior NAME HP STRENGTH o knight NAME HP STRENGTH ARMOR. Imprime describe() y el ataque. Para knight Arthur 120 15 8, imprime:

Arthur (120 HP), strength 15, armor 8
Attack: 20

Tu código va en warrior.gd y knight.gd. main.gd contiene el código de entrada/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())
	for i in count:
		var p := OS.read_string_from_stdin().split(" ")
		var c: Character
		if p[0] == "knight":
			c = Knight.new(p[1], int(p[2]), int(p[3]), int(p[4]))
		elif p[0] == "warrior":
			c = Warrior.new(p[1], int(p[2]), int(p[3]))
		else:
			c = Character.new(p[1], int(p[2]))
		print(c.describe())
		print("Attack: %d" % c.attack())
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